我刚开始玩网络开发,而node.js + express帮助我在不那么强大的嵌入式系统上快速获得一个简单的服务器。但是,当尝试将270MB目录作为tarfile提供时,我的解决方案的性能并不好。
在获得irc的帮助后,我尝试使用fstream和node-tar提供文件,如下所示:
fstream.Reader({ type: "Directory" , path: mydir }).pipe(tar.Pack({})).on("error", function(){ res.statusCode = 500; res.end('Unable to create tarball'); }).pipe(res)
它可以工作,但是将270MB文件下载到我的电脑需要大约20分钟。作为一个实验,我尝试将目标上的文件夹命名为tar,然后将其压缩到我的PC上。这需要1m12s + 2m17s,这是一个很大的不同。
(我尝试使用node-static提供pre-tar'ed文件,但我的嵌入式系统内存不足)
有什么想法可以使express + node.js-solution这么慢?
使用一些基准测试进行更新:
我怀疑使用其他网络服务器对于静态文件服务会更好,但我认为它不能解释这里的重大差异。
对文件夹进行基准测试,产生64MB tar
手册:
46秒
# on server:
tar -cf foo.rar <folder>
# on client
scp root@<ip>/path/to/foo.rar .
fstream + node-tar:直接
4分25秒
fstream.Reader({type: "Directory", path: dir}).pipe(tar.Pack({})).on("error", function(){res.statusCode = 500; res.end('Unable to create tarball');}).pipe(res);
fstream + node.tar:首先流式传输到文件,然后提供文件
1分11秒
fstream.Reader({type: "Directory", path: dir}).pipe(tar.Pack({})).on("error", function(){res.statusCode = 500; res.end('Unable to create tarball');}).pipe(fstream.Writer('/tmp/test.rar').on("close", function() {
var rs = fs.createReadStream('/tmp/test.rar');
rs.on('data', function(data) {
res.write(data);
});
rs.on('end', function() {
res.end();
});
}));