比较:用缓冲区视图调整ArrayBuffer的大小(Uint8 vs Float64),我是不是遗漏了什么

Comparison: Resizing ArrayBuffer with buffer views (Uint8 vs Float64), am I missing something?

本文关键字:Float64 vs 是不是 什么 Uint8 视图 缓冲区 调整 ArrayBuffer 比较      更新时间:2024-05-20

我一直在寻找如何调整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使用Uint8Array,因此对于baseArrayBuffer中的每个字节,您必须将其单独复制到调整大小的数组缓冲区。现在对于#2,我使用Float64Array,因此我可以迭代8倍以下的索引以获得相同的结果。

关注点:使用Float64Array似乎是一种明显的"更高性能"的方法;然而,在使用Float64Array时,我是否缺少了一些东西?通过Float64Array视图设置每个索引时,是否会丢失值精度?除了确保字节大小可以被8整除之外,还有其他缺点吗?

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

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/