Javascript 目前,使用Buffer/Uint8Array而不是普通阵列是否具有明显的性能优势?

Javascript 目前,使用Buffer/Uint8Array而不是普通阵列是否具有明显的性能优势?,javascript,node.js,performance,Javascript,Node.js,Performance,我相信,如今,像V8这样的JavaScript引擎总是能够检测数组何时只有0-255范围内的数值,从而将其存储为未绑定的Uint8数组。因此,我们可以期望它们与强类型的对应项一样高效。不过,在代码库中使用单个数组类型要比使用多个数组类型方便得多 2017年,使用Buffer/Uint8Arrays而不是普通阵列是否仍有明显的性能优势?请参阅下面我用于性能测试的代码。这表明缓冲区较慢,这与其他一些历史数据一致 其他相关数据点: //设置 //持续时间=1000; 持续时间=1000; 让ar

我相信,如今,像V8这样的JavaScript引擎总是能够检测数组何时只有
0-255
范围内的数值,从而将其存储为未绑定的Uint8数组。因此,我们可以期望它们与强类型的对应项一样高效。不过,在代码库中使用单个数组类型要比使用多个数组类型方便得多


2017年,使用
Buffer
/
Uint8Array
s而不是普通阵列是否仍有明显的性能优势?

请参阅下面我用于性能测试的代码。这表明
缓冲区
较慢,这与其他一些历史数据一致

其他相关数据点:

  • //设置
    //持续时间=1000;
    持续时间=1000;
    让arresults=[];
    函数randomChar(){
    var chars='0123456789abcdefghijklmnopqrstuvxyzabcdefghijklmnopqrstuvxyz';
    返回字符[Math.round(Math.random()*(chars.length-1))];
    }
    函数singleTest(){
    //缓冲区
    const t0=process.hrtime();
    设buf=Buffer.from(randomChar());//建议使用.from()初始化
    对于(变量i=1;i

  • 当V8无法保证添加到阵列中的下一个数据类型是什么时,它如何进行这样的优化?出于好奇,您能否提供一个链接,指向您在哪里读到的有关该检测的信息?@peteb它将整个数组包装在一个对象中,每当您插入某个内容时,该对象都会执行轻量级类型检查。如果插入的不是字节,V8会将整个内容解压并构建一个非类型化数组。至少,我认为它是这样工作的。事实上,我从来没有读过。
    //setup
    //const iNumTests = 1000;
    const iNumTests = 1000;
    let arrResults = [];
    
    function randomChar() {
    var chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    return chars[Math.round(Math.random() * (chars.length - 1))];
    }
    
    function singleTest() {
        //buffer
        const t0 = process.hrtime();
        let buf = Buffer.from(randomChar());  //recommended to initialize with .from()
        for (var i = 1; i < iNumTests; ++i) {
            buf.write(randomChar());
        }
        var sOutput = buf.toString();
        const arrBuff = process.hrtime(t0);
    
        //array
        const t1 = process.hrtime();
        let chars = [];
        for (var i = 0; i < iNumTests; ++i) {
            chars.push(randomChar());
        }
        var sOutput = chars.join('');
        const arrArray = process.hrtime(t1);
    
        //delta
        const timeBuff = arrBuff[0] * 1e9 + arrBuff[1];
        const timeArray = arrArray[0] * 1e9 + arrArray[1];
        return (timeBuff - timeArray);
    }
    
    for (var i = 0; i < iNumTests; i++) {
        arrResults.push(singleTest());
    }
    
    var sum = arrResults.reduce(function(acc, val) {
      return acc + val;
    }, 0);
    
    console.log(sum/iNumTests);         // average difference. I got 146929.598 which means timeBuff is larger on average.