Uint8Array在Javascript中使用的案例

9
我刚刚发现 Javascript 有通过 这个链接 使用类型化数组。我立即好奇这种对象在语言中的好处是什么。
我注意到 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
阅读此链接:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Typed_arrays。主要用途是处理来自外部世界的原始二进制数据,您希望在javascript中访问该数据。 - jfriend00
1
如果编译器可以验证典型数组的所有成员始终是相同类型的,它可以优化使用类型化数组。在运行测试之前,请执行此操作:a[0] = null。在数学运算中,null将被视为0,但这会对计时结果产生非常大的影响。在我的机器上,时间从约5ms变为约47ms - user1106925
我在WebGL和WebSockets中使用它们,都是为了处理二进制数据而不必将其带入“本地”JavaScript数组。 - Adam
1个回答

14

“性能”通常不仅仅意味着您的脚本运行速度有多快。还有许多其他重要因素,例如它会多快地使您的计算机冻结和/或崩溃、内存占用等。JavaScript 实现通常为变量分配的最小内存量为 32 位。这意味着

var a = true;

布尔值在内存中的表现形式如下:

0000 0000 0000 0000 0000 0000 0000 0001

这是一种浪费,但通常不会成为问题,因为没有人使用足够数量的它们来真正影响。Typed Arrays 用于那些确实需要考虑内存使用情况的场合,比如处理图像数据、声音数据或各种原始二进制数据时,你可以显著减少内存使用。

另一个区别是,在某些情况下,它允许您通过引用操作传递参数而不是值,从而可以潜在地节省更多内存。

考虑这个例子:

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

现在你有两个独立的视图,它们都在操作同一份数据的ArrayBuffer。应用这个概念不仅允许你将一个巨大的东西保存在内存中,而且允许你将其细分为尽可能多的段,以便你可以在需要时轻松地处理每个区段,这也许更加重要。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接