为什么在Javascript中更改缓冲区比添加字符串慢? console.time('1'); b=缓冲区分配(100); 对于(变量ctr=0;ctr

为什么在Javascript中更改缓冲区比添加字符串慢? console.time('1'); b=缓冲区分配(100); 对于(变量ctr=0;ctr,javascript,node.js,Javascript,Node.js,时间:0.213ms console.time('#1'); b = Buffer.alloc(100); for (var ctr = 0; ctr < b.length; ctr++) { b[ctr] = 65; } console.timeEnd('#1'); console.time('2'); 让结果=“”; 对于(变量ctr=0;ctr

时间:0.213ms

console.time('#1');
b = Buffer.alloc(100);

for (var ctr = 0; ctr < b.length; ctr++) {
    b[ctr] = 65;
}
console.timeEnd('#1');
console.time('2');
让结果=“”;
对于(变量ctr=0;ctr<100;ctr++){
结果+=String.fromCharCode(65);
}
控制台.timeEnd('2');
时间:0.121ms

我本以为#1——缓冲区的变化——会更快。 我真的很惊讶,想知道为什么附加到字符串会更快

增编:

正在从测试中删除Buffer.alloc

console.time('#2');
let result = '';
for (var ctr = 0; ctr < 100; ctr++) {
    result += String.fromCharCode(65);
}
console.timeEnd('#2');
b=Buffer.alloc(100);
控制台时间('1');
对于(变量ctr=0;ctr
时间:0.136ms

从测试中删除。长度并设置为100

b = Buffer.alloc(100);

console.time('#1');
for (var ctr = 0; ctr < b.length; ctr++) {
    b[ctr] = 65;
}
console.timeEnd('#1');
b=Buffer.alloc(100);
控制台时间('1b');
对于(变量ctr=0;ctr<100;ctr++){
b[ctr]=65;
}
控制台.timeEnd('1b');
时间:0.117ms

b = Buffer.alloc(100);

console.time('#1b');
for (var ctr = 0; ctr < 100; ctr++) {
    b[ctr] = 65;
}
console.timeEnd('#1b');
console.time('2');
让结果=“”;
对于(变量ctr=0;ctr<100;ctr++){
结果+=String.fromCharCode(65);
}
控制台.timeEnd('2');
时间:0.125ms


似乎调整“Buffer.alloc”(这是预期的)和“.length”都增加了执行时间。有趣的练习。

< P>记住No.js是在谷歌V8上编译的,它是用C++编码的。缓冲区和字符串都分配内存。。。但缓冲区是为原始字节构建的。我知道缓冲区分配一个直的C/C++数组字节,JavaScript字符串实际上变成后端的C++ STD::String对象,这并不奇怪。分配内存中的单个操作在缓冲区上通常会更快。。。但是,当涉及字符串/缓冲区的动态大小时,性能益处将倾向于字符串,因为C++ STD::string可以在内存中调整内存需求,而数组必须每次都完全分配新的内存。
真正有趣的是,如果您首先分配缓冲区并首先声明字符串。。。然后在循环操作上运行times…

我的第一个猜测是一些大的JS编译器优化应用于循环中的字符串构建,而不是缓冲区值分配。另外,请注意
b[ctr]=“a”似乎不起作用。这样访问缓冲区时,需要在缓冲区中放入一个整数值。是的,谢谢。。。我调整了密码。时间在变化后保持不变。你的逻辑在这里没有真正的意义。缓冲区被完全分配一次,因此不需要重新分配。字符串不是预先分配的,因此可能需要一些重新分配,但是字符串的大小写速度要快得多。这不能解释。这里还有别的事情。我的猜测是在对这个问题的评论中(这是关于内置在V8编译器中的字符串构建优化,不适用于缓冲区操作)。
console.time('#2');
let result = '';
for (var ctr = 0; ctr < 100; ctr++) {
    result += String.fromCharCode(65);
}
console.timeEnd('#2');