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