javascript - Uint8Array Javascript 用例

标签 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 的正确用例是什么?看起来普通数组更灵活,同样健壮且同样快速。

最佳答案

“性能”通常并不意味着您的脚本运行速度有多快。还有许多其他重要因素,例如它卡住您的电脑和/或崩溃的速度。内存。 javascript 实现通常分配给 var 的最小内存量是 32 位。这意味着

var a = true;

一个 bool 值在你的内存中看起来像这样:

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 个独立的 View ,对同一个数据进行操作,应用这个概念不仅可以让你的内存中有一个巨大的东西,它还可以让你将它分割为尽可能多的段目前希望以很少的开销进行工作,这可能更为重要。

关于javascript - Uint8Array Javascript 用例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26319531/

相关文章:

javascript - 如何动态扩展 ES5 和 ES6 类

javascript - 如何加载没有 Script 标签的 Javascript 文件?

javascript - 多个谷歌地点请求功能(药房定位器)

Python:字符串连接在for循环中的工作方式不同

javascript - 为什么使用多个条件过滤对象数组会返回空数组?

python - 在python中打印出数组中的模式

javascript - 缩略图切换器不起作用

javascript - 使用 JavaScript 正则表达式

javascript - 反向数组函数在 javascript 中不起作用

python - 按内部数组的长度对 numpy 数组的 numpy 数组进行排序