gpt4 book ai didi

javascript - 比较 : Resizing ArrayBuffer with buffer views (Uint8 vs Float64), 我错过了什么吗?

转载 作者:行者123 更新时间:2023-11-29 10:45:27 25 4
gpt4 key购买 nike

我一直在寻找调整 ArrayBuffers 大小的方法,我找到了以下两种方法:

1 (Uint8Array):

function resizeUint8(baseArrayBuffer, newByteSize) {
var resizedArrayBuffer = new ArrayBuffer(newByteSize),
resizedView = new Uint8Array(resizedArrayBuffer),
baseView = new Uint8Array(baseArrayBuffer);

for(var i = 0; i < baseView.length; i++) {
resizedView[i] = baseView[i];
}

return resizedArrayBuffer;
}

2 (Float64Array):

// newByteSize is divisible by 8
function resizeFloat64(baseArrayBuffer, newByteSize) {
var resizedArrayBuffer = new ArrayBuffer(newByteSize),
resizedView = new Float64Array(resizedArrayBuffer),
baseView = new Float64Array(baseArrayBuffer);

for(var i = 0; i < baseView.length; i++) {
resizedView[i] = baseView[i];
}

return resizedArrayBuffer;
}

比较:#1 使用 Uint8Arrays,因此对于 baseArrayBuffer 中的每个字节,您必须将其单独复制到调整大小的数组缓冲区。现在对于 #2,我使用 Float64Array,因此我可以迭代 8 倍以上的索引来获得相同的结果。

关注点:使用 Float64Array 似乎是明显的“性能更高”的方法;但是,使用 Float64Array 时我是否遗漏了什么?通过 Float64Array View 设置每个索引时,我会丢失值精度吗?还有其他缺点吗(除了确保字节大小可以被 8 整除)?

最佳答案

使用 typedArray.set 方法,而不是复制 for 循环中的每个元素,它更快

function resizeUint8(baseArrayBuffer, newByteSize) {
var resizedArrayBuffer = new ArrayBuffer(newByteSize),
len = baseArrayBuffer.byteLength,
resizeLen = (len > newByteSize)? newByteSize : len;

(new Uint8Array(resizedArrayBuffer, 0, resizeLen)).set(new Uint8Array(baseArrayBuffer, 0, resizeLen));

return resizedArrayBuffer;
}

JSFiddle 测试:http://jsfiddle.net/92zsn529/

关于javascript - 比较 : Resizing ArrayBuffer with buffer views (Uint8 vs Float64), 我错过了什么吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20486053/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com