【发布时间】:2015-05-24 06:33:59
【问题描述】:
在尝试为自己构建 Webgl 3d 库时(主要是为了学习),我遵循了从各种来源找到的文档,其中指出 TypedArray 函数 set()(特别是针对 Float32Array)应该是“as fast as" memcpy in C(显然是舌头在脸颊上),根据html5rocks,实际上是最快的。看起来是正确的(在 javascript 中没有设置循环,消失在一些超快的类型数组中,纯 C 废话等等)。
我在glMatrix 看了一眼(顺便说一句,做得很好!),并注意到他(作者)说他为了速度而展开了所有循环。这显然是 javascript 大师通常会以尽可能快的速度做的事情,但是,根据我之前的阅读,我认为我在这个库上有 1-up,具体来说,他创建了他的库以同时使用数组和类型数组,因此我认为使用“set()”可以提高速度,因为我只对类型化数组类型感兴趣。
为了测试我的理论,我设置了这个jsperf。不仅 set() 相对缺乏速度,而且我尝试过的所有其他技术(在 jsperf 中)都胜过它。这是迄今为止最慢的。
最后,我的问题是:为什么?从理论上讲,我可以理解在 spidermonkey 或 chrome V8 js 引擎中进行高度优化的循环展开,但是输给 for 循环似乎很荒谬(jsperf 中的 copy2),尤其是如果它的目的是由于原始连续而在理论上加快复制速度内存数据类型(typedarrays)。无论哪种方式,都感觉 set() 函数坏了。
这是我的代码吗?我的浏览器? (我使用的是 Firefox 24)还是我错过了其他一些优化理论?任何有助于理解这个与我的想法和理解相反的结果都会非常有帮助。
【问题讨论】:
-
我能想到的唯一解释是它不假设数组类型匹配,所以做一些可怕的不必要的类型转换。虽然这是一个猜测,但很可能是别的东西!
-
确实 set() 函数可以接收典型的 javascript 数组或 TypedArray ......也许吧?但它似乎仍然很糟糕......它甚至没有接近其他类型的在数组中复制数据的方法......
标签: javascript performance optimization webgl typed-arrays