将 BigInt 转换为 Uint8Array 的最快方法?

问题描述 投票:0回答:1

情况:

一个 JSON 对象,包含约 3000 个元素的数组。每个元素都有格式

base64String.base64String.base64String.base64String....

大约 20-30 个 base64 字符串,用

.
分隔。

这些base64String包含很多信息。和价值观。值被汇总到 bigInt 中。然后将 bigInt 转换为字节以用于散列等等。

整个过程需要尽可能快,因为这只是整个处理链的一小部分,一切都需要很快。 bigInts 值限制为 64 位(Java Long)。

我测试了3个选项:

function bigIntToBigEndianBytesLoop(value) {
    const hex = value.toString(16).padStart(8 * 2, '0');
    const bytes = new Uint8Array(8);
    for (let i = 0; i < 8; i++) {
        bytes[i] = parseInt(hex.slice(i * 2, i * 2 + 2), 16);
    }
    return bytes;
}

function bigIntToBigEndianBytesDataView(value) {
    const buf = new ArrayBuffer(8);
    const view = new DataView(buf);

    view.setBigUint64(0, value);
    return new Uint8Array(buf);
}

function bigIntToUint8ArrayDirect(num) {
    const result = new Uint8Array(8);
    result[7] = Number(num & 0xffn);
    result[6] = Number((num >> 8n) & 0xffn);
    result[5] = Number((num >> 16n) & 0xffn);
    result[4] = Number((num >> 24n) & 0xffn);
    result[3] = Number((num >> 32n) & 0xffn);
    result[2] = Number((num >> 40n) & 0xffn);
    result[1] = Number((num >> 48n) & 0xffn);
    result[0] = Number((num >> 56n) & 0xffn);
    return result;
}

到目前为止,直接方法似乎是最快的。 https://www.measurethat.net/Benchmarks/Show/33000/3/bigint-to-bigendian-bytes 还有其他方法可以使用吗?

javascript bigint uint8array
1个回答
0
投票

您可以首先将 BigInt 拆分为两个数字(32 位),然后继续处理这两个数字:

// Direct Constructor with split
function bigIntToUint8ArrayDirectConstructor2(value) {
    const result = new Uint8Array(8);
    const low = Number(value & 0xffffffffn);
    const high = Number((value >> 32n) & 0xffffffffn); 
    result[7] = low & 0xff;
    result[6] = (low >> 8) & 0xff;
    result[5] = (low >> 16) & 0xff;
    result[4] = (low >> 24) & 0xff;
    result[3] = high & 0xff;
    result[2] = (high >> 8) & 0xff;
    result[1] = (high >> 16) & 0xff;
    result[0] = (high >> 24) & 0xff;
    return result;
}

这就是我得到的:

enter image description here

将此变体添加为“带拆分的直接构造函数”的基准

© www.soinside.com 2019 - 2024. All rights reserved.