【发布时间】:2014-10-11 21:39:04
【问题描述】:
我刚刚发现 Javascript 通过this 链接输入了数组。我立即很好奇这些对象在语言中可能有什么好处。
我注意到 UInt8Arrays 丢失了 .map() 类型的函数,而这些函数对于普通数组对象是有的,所以如果你想循环它们,你需要一个 for 循环。
我认为在使用 UInt8Arrays 时我可能会期待一些性能提升,但情况似乎并非如此。
var a = d3.range(225)
var b = new Uint8Array(d3.range(225))
console.time("a")
var result = 0;
for (var j = 10000; j >= 0; j--) {
for (var i = a.length - 1; i >= 0; i--) {
result += a[i];
};
};
console.timeEnd("a")
console.time("b")
var result = 0;
for (var j = 10000; j >= 0; j--) {
for (var i = b.length - 1; i >= 0; i--) {
result += b[i];
};
};
console.timeEnd("b")
我正在使用 d3 库快速生成一个大数组。该脚本提供以下输出:
a: 2760.176ms
b: 2779.477ms
所以性能没有提高。 UInt8Array 在插入错误值时也不会抛出错误。
> new Uint8Array([1,2,3,4,'aasdf'])
[1,2,3,4,0]
考虑到这一点,JavaScript 中UInt8Array 的正确用例是什么?看起来普通数组更加灵活,同样强大且同样快速。
【问题讨论】:
-
阅读:developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays。一个主要用途是处理来自外部世界的原始二进制数据,您希望在 javascript 中访问这些数据。
-
如果编译器可以验证典型 Array 的所有成员始终属于同一类型,则可以优化以使用类型化数组。在运行测试之前执行此操作:
a[0] = null。在数学运算中,null将被视为0,但它会在定时结果中产生非常大的差异。在我的机器上,它从大约5ms到大约47ms。 -
我在 WebGL 和 WebSockets 中使用过它们,它们都用于“按原样”处理二进制数据,而无需引入“原生”JavaScript 数组。
标签: javascript arrays