什么时候使用Float32Array
代替标准JavaScript Array
来构建浏览器应用程序?
此performance test显示Float32Array
通常较慢 - 如果我理解正确,标准Array
会将数字存储为64位 - 因此精确度没有优势。
除了任何可能的性能影响之外,Float32Array
还具有可读性的缺点 - 必须使用构造函数:
a = new Float32Array(2);
a[0] = 3.5;
a[1] = 4.5;
而不是数组文字
a = [3.5, 4.5];
我问这个因为我正在使用默认为Float32Array
的库glMatrix - 并且想知道是否有任何理由我不应强迫它使用Array
而这将允许我使用数组文字。
答案 0 :(得分:60)
我通过电子邮件向glMatrix
的开发人员发送电子邮件,我的回答包括他的评论(第2点和第3点):
Array
创建新对象通常比Float32Array
更快。对于小型阵列,增益很重要,但对于较大的阵列,增益较小(取决于环境)。
从TypedArray(例如Float32Array
)访问数据通常比从普通数组快,这意味着大多数数组操作(除了创建新对象)使用TypedArrays会更快。
正如@emidander所述,glMatrix
主要是为WebGL开发的,它要求向量和矩阵作为Float32Array
传递。因此,对于WebGL应用程序,任何性能测量都需要包含从Array
到Float32Array
的潜在代价高昂的转换。
因此,毫不奇怪,最佳选择是依赖于应用程序:
如果数组通常较小,和/或对它们的操作数量较少,因此构造函数时间占数组生命周期的很大一部分,请使用Array
。
如果代码可读性与性能同等重要,则使用Array
(即使用[]
而不是构造函数)。
如果数组非常大和/或用于许多操作,则使用TypedArray。
对于WebGL应用程序(或其他需要进行类型转换的应用程序),请使用Float32Array
(或其他TypedArray)。
答案 1 :(得分:7)
我认为glMatrix库使用Float32Array,因为它主要用于WebGL应用程序,其中矩阵表示为Float32Arrays(http://www.khronos.org/registry/webgl/specs/1.0/#5.14.10)。
答案 2 :(得分:0)
在当今的浏览器实现中,与普通数组相比,使用Float32Array在可写性和性能上都有影响。似乎甚至gl-matrix的作者都同意需要重构该库以删除Float32Array依赖项:https://github.com/toji/gl-matrix/issues/359