偶然发现一个现象:通过for循环向文件写入数据,性能表现不一 代码如下: var fs=require(‘fs’); var out=fs.createWriteStream(‘./test1.txt’); console.time(‘forNode’); for(var i=1;i<=200000;i++){ var flag=out.write(‘9999’); //console.log(flag); } console.timeEnd(‘forNode’);
问题如下: 当改变 i 的值分别是1万、5万、10万、15万、20万时,其所谓的时间测试基本线性增长,但问题来了: test1.txt的实际写入完成时间却在超过10万之后,急剧下降,几乎是龟速。(每次都是新建空文件之后进行测试) 例如, 在i=10万时,实际写入时间大约不到20秒(口算),体积为391KB。 在i=20万时, 实际写入时间大约为N秒 (实在记不下去了,口算30秒后才15KB,最后体积大约是700多KB。测了多次,都是这样。手动不断刷新,会发现test1.txt在1K、1K的增长。
为什么在i在1万、5万、10万,写入时间基本都线性增长,为何到了20万,就变成龟速?
7 回复
var fs = require(‘fs’);
var out = fs.createWriteStream(‘./test1.txt’);
var start = Date.now();
(function write(i) {
if (i >=0 && i < 200000) {
out.write('9999', function () {
write(i+1);
});
} else {
console.log('time : %dms', Date.now() - start);
}
}(0));
time : 15413ms
我没记错的话,javascript的字符串是16位,16ב9999’=64位=8字节。 连续20万次操作,相当于让缓冲区排队20万×8字节,约1.6M内存了。 最好是用串行写入。这样排队,缓冲区最大只有8字节。