3

我一直在寻找如何调整 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 视图设置每个索引时是否会丢失值精度?是否有任何其他缺点(除了确保字节大小可被 8 整除)?

4

1 回答 1

3

而不是复制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/

于 2014-10-07T11:12:08.800 回答