Uint8Array Javascript用例

Uint8Array Javascript用例,javascript,arrays,Javascript,Arrays,我刚刚发现Javascript通过链接键入了数组。我立刻感到好奇,这种东西在语言中有什么好处 我注意到UInt8Arrays丢失了正常数组对象的.map()-类型函数,因此如果要在其上循环,则需要使用for循环 我假设在使用UINT8阵列时,我可能会期望性能有所提高,但事实似乎并非如此 var a = d3.range(225) var b = new Uint8Array(d3.range(225)) console.time("a") var result = 0; for (var j

我刚刚发现Javascript通过链接键入了数组。我立刻感到好奇,这种东西在语言中有什么好处

我注意到UInt8Arrays丢失了正常数组对象的
.map()
-类型函数,因此如果要在其上循环,则需要使用
for
循环

我假设在使用UINT8阵列时,我可能会期望性能有所提高,但事实似乎并非如此

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;
在您的内存中,布尔值如下所示:

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

另一个区别是,在某些情况下,它允许您潜在地节省更多内存,因为它允许您对通常按值传递的引用传递的数据进行操作

考虑这种情况:

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

现在,您在同一个ArrayBuffer上有两个独立的视图,在相同的数据上操作,应用该概念不仅可以让您的内存中有一个巨大的东西,还可以让您以较小的开销将它实际细分为您当前想要处理的任意多个部分,这可能更重要。

阅读以下内容:。一个主要用途是处理来自外部世界的原始二进制数据,您希望在javascript中访问这些数据。如果编译器可以验证一个典型数组的所有成员始终是同一类型的,那么它可以优化为使用类型化数组。在运行测试之前执行此操作:
a[0]=null
。在数学运算中,
null
将被视为
0
,但它会在计时结果中产生非常大的差异。在我的机器上,它从大约
5ms
到大约
47ms
。我在WebGL和WebSockets中使用过它们,它们都是“按原样”处理二进制数据,而不必引入“本机”JavaScript数组。