我刚刚发现Javascript通过此链接输入了数组。我立即好奇这种对象在语言中可能带来什么好处。
我注意到UInt8Arrays失去了.map()普通数组对象需要的-type函数,因此,如果要遍历它们,则需要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")
Run Code Online (Sandbox Code Playgroud)
我正在使用d3库快速生成大型数组。该脚本提供以下输出:
a: 2760.176ms
b: 2779.477ms
Run Code Online (Sandbox Code Playgroud)
因此性能不会提高。当您插入错误的值时,UInt8Array也不会引发错误。
> new Uint8Array([1,2,3,4,'aasdf'])
[1,2,3,4,0]
Run Code Online (Sandbox Code Playgroud)
考虑到这一点,UInt8ArrayJavascript 的正确用例是什么?看来普通阵列要灵活得多,同样健壮且同样快。
“性能”通常并不意味着脚本运行的速度。还有许多其他重要因素,例如冻结计算机的速度和/或崩溃的速度。记忆。JavaScript实现通常为var分配的最小内存量是32位。这意味着
var a = true;
Run Code Online (Sandbox Code Playgroud)
内存中的布尔值看起来像这样:
0000 0000 0000 0000 0000 0000 0000 0001
Run Code Online (Sandbox Code Playgroud)
这是一个巨大的浪费,但通常不是问题,因为没有人使用足够多的东西来真正解决问题。当您实际上可以大量减少内存使用时(例如,使用图像数据,声音数据或各种原始二进制数据时),类型化数组适用于确实重要的情况。
另一个不同之处在于,在某些情况下,您可以节省更多的内存,这是您可以对通常按值传递的引用传递的数据进行操作。
考虑这种情况:
var oneImage = new Uint8Array( 16 * 16 * 4 );
var onePixel = new Uint8Array( oneImage.buffer, 0, 4 );
Run Code Online (Sandbox Code Playgroud)
现在,您在同一个ArrayBuffer上有2个独立的视图,对相同的数据进行操作,应用这一概念不仅可以使您的内存中拥有一个巨大的东西,还可以将其实际细分为您当前想要的尽可能多的段以很少的开销进行工作,这可能甚至更重要。
| 归档时间: |
|
| 查看次数: |
880 次 |
| 最近记录: |