何时在JavaScript中使用Float32Array而不是Array

时间:2013-04-04 22:45:20

标签: javascript arrays

什么时候使用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而这将允许我使用数组文字。

3 个答案:

答案 0 :(得分:60)

我通过电子邮件向glMatrix的开发人员发送电子邮件,我的回答包括他的评论(第2点和第3点):

  1. Array创建新对象通常比Float32Array更快。对于小型阵列,增益很重要,但对于较大的阵列,增益较小(取决于环境)。

  2. 从TypedArray(例如Float32Array)访问数据通常比从普通数组快,这意味着大多数数组操作(除了创建新对象)使用TypedArrays会更快。

  3. 正如@emidander所述,glMatrix主要是为WebGL开发的,它要求向量和矩阵作为Float32Array传递。因此,对于WebGL应用程序,任何性能测量都需要包含从ArrayFloat32Array的潜在代价高昂的转换。

  4. 因此,毫不奇怪,最佳选择是依赖于应用程序:

    • 如果数组通常较小,和/或对它们的操作数量较少,因此构造函数时间占数组生命周期的很大一部分,请使用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