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

pan*_*ake 43 javascript arrays

何时使用Float32Array标准JavaScript Array代替浏览器应用程序是有意义的?

通常,这种性能测试表明Float32Array速度较慢 - 如果我理解正确,标准Array将数字存储为64位 - 因此精度没有优势.

除了任何可能的性能损失之外,Float32Array还具有可读性的缺点 - 必须使用构造函数:

a = new Float32Array(2);
a[0] = 3.5;
a[1] = 4.5;
Run Code Online (Sandbox Code Playgroud)

而是一个数组文字

a = [3.5, 4.5];
Run Code Online (Sandbox Code Playgroud)

我问这个因为我正在使用默认的库glMatrix Float32Array- 并且想知道是否有任何理由我不应该强制使用它Array而不允许我使用数组文字.

pan*_*ake 66

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

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

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

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

所以,毫不奇怪,最好的选择是依赖于应用程序:

  • 如果数组通常较小,和/或对它们的操作数量较少,那么构造函数时间占阵列寿命的很大一部分,请使用Array.

  • 如果代码可读性和性能一样重要,那么使用Array(即使用[],而不是构造函数).

  • 如果数组非常大和/或用于许多操作,则使用TypedArray.

  • 对于WebGL应用程序(或其他需要进行类型转换的应用程序),请使用Float32Array(或其他TypedArray).

  • @yuvi对我来说"大"意味着占用大量内存资源.例如,在节点中,我创建了10,000,000个数字的数组,整个节点进程占用了86MB.使用10,000,000节点的Float32Array仅显示46MB. (3认同)
  • “大”和“小”是非常模糊的描述,在不同的上下文中会发生变化。当我们谈论 Float32Array 与非常小的数组时,任何人都可以扩展一下被认为是“非常大”的数组吗? (2认同)

emi*_*der 7

我假设glMatrix库使用Float32Array,因为它主要用于WebGL应用程序,其中矩阵表示为Float32Arrays(http://www.khronos.org/registry/webgl/specs/1.0/#5.14.10).