【问题标题】:Are there, currently, noticeable performance advantages in using Buffer / Uint8Array instead of plain arrays?目前,使用 Buffer / Uint8Array 代替普通数组是否有明显的性能优势?
【发布时间】:2017-04-14 15:45:18
【问题描述】:

我相信,如今,V8 等 JavaScript 引擎始终能够检测到数组何时只有 0-255 范围内的数值,因此将其存储为未装箱的 Uint8 数组。因此,可以预期它们与强类型对应物一样有效。不过,在您的代码库中使用单一数组类型比拥有多个数组类型要方便得多。

在 2017 年,使用 Buffer/Uint8Arrays 而不是普通数组是否仍有明显的性能优势?

【问题讨论】:

  • 当 V8 无法保证下一个添加到 Array 的数据类型是什么时,它怎么能做出这样的优化呢?出于好奇,您能否提供一个链接,指向您阅读该检测的地方?
  • @peteb 它将整个数组包装在一个对象中,该对象在您插入某些内容时执行轻量级类型检查。如果您要插入不是字节的内容,V8 会解压缩整个内容并构建一个无类型数组。至少,我认为它是这样工作的。我实际上从未读过它。

标签: javascript node.js performance


【解决方案1】:

请参阅下面我用于性能测试的代码using this RunKit。说明Buffer比较慢,这和其他一些历史数据是一致的。

其他相关数据点:

  1. This jsPerf
  2. This other jsPerf
  3. This older SO thread.

    //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.
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-18
    • 1970-01-01
    • 1970-01-01
    • 2015-03-30
    • 2017-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多