Node.js的write性能为何急剧下降?
发布于 10 年前 作者 wangjingbo 4973 次浏览 最后一次编辑是 8 年前 来自 问答

偶然发现一个现象:通过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 回复

额 你这是在测v8的性能 跟nodejs关系不大 而且你测试的时间也不准确 你可以试着把write操作换成其他试试

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字节。

多谢二位。 其实我不在测试性能。只是发现了这个现象,在10万时,十多秒文件的写入就完成了(判断标志是程序返回,物理文件体积不再变化,而不是console打印的时间)。 但在20万时,就不是多少秒了,而是很长很长时间,同时物理文件的体积从一开始就几乎每秒才增加1K,不知道为什么!

你改用并行写就行了。哦,node没法并行⊙▽⊙

@ngot fibjs能并发写一个文件?

@wangjingbo 同上,我也遇到这个问题。 但我是写数据库。

调用C或C++会怎样?试试。。。

回到顶部