【问题标题】:Uint8Array Javascript usecaseUint8Array Javascript 用例
【发布时间】: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


【解决方案1】:

“性能”通常并不意味着您的脚本运行速度有多快。还有许多其他重要因素,例如它冻结您的电脑和/或崩溃的速度。记忆。 javascript 实现通常为 var 分配的最小内存量是 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 个独立的视图,对相同的数据进行操作,应用该概念不仅可以让您在内存中拥有一个巨大的东西,它还可以让您实际上将其细分为尽可能多的段目前想要以很少的开销工作,这可能更重要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-15
    • 2021-05-10
    • 2020-06-03
    • 2018-09-27
    • 1970-01-01
    • 1970-01-01
    • 2012-02-14
    • 1970-01-01
    相关资源
    最近更新 更多