Uint8Array Javascript用例

时间:2014-10-11 21:39:04

标签: javascript arrays

我刚刚发现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的正确用例是什么?看起来普通阵列更灵活,同样强大且同样快速。

1 个答案:

答案 0 :(得分:4)

"性能"通常并不意味着你的脚本运行速度有多快。还有许多其他重要因素,例如它冻结你的电脑和/或崩溃的速度有多快。记忆。通常为var分配的最小内存javascript实现是32位。这意味着

var a = true;

布尔在你的记忆中看起来像这样:

0000 0000 0000 0000 0000 0000 0000 0001

这是一个巨大的浪费,但通常不是问题,因为没有人使用足够多的它来真正重要。类型化数组适用于重要的情况,当您实际上可以大量减少内存使用量时,例如处理图像数据,声音数据或各种原始二进制数据时。

允许您在某些情况下可能节省更多内存的另一个不同之处在于,它允许您对通过引用传递的数据进行操作,而这通常是通过值传递的。

考虑这种情况:

var oneImage = new Uint8Array( 16 * 16 * 4 );
var onePixel = new Uint8Array( oneImage.buffer, 0, 4 );

你现在在同一个ArrayBuffer上拥有2个独立的视图,对相同的数据进行操作,应用这个概念不仅可以让你在你的记忆中有一个巨大的东西,它允许你实际上将它细分为你的多个细分目前希望以较少的开销工作,这可能更为重要。