Javascript 优化post调用以保存PerformACE

Javascript 优化post调用以保存PerformACE,javascript,node.js,performance,express,unzip,Javascript,Node.js,Performance,Express,Unzip,我有一个节点应用程序,它正在从RESTAPI请求中获取zip文件。对于大小为2MB的文件,我使用以下代码,这几乎需要10秒,这里有没有提高性能的方法 该文件应解压缩并保存在本地系统中 此代码工作正常,除了性能 `一,。如果请求应该从客户端调用,则需要很长时间 我应该什么时候发送回复?如果我能等到这个过程 完成这个可能需要10秒 2.在这种情况下,我是否应该使用承诺?如果是,请提供以下代码的示例(blue bird,q…) 3.有一种方法可以优化性能 代码不是问题,当我运行精确的代码时,提取7.5

我有一个节点应用程序,它正在从RESTAPI请求中获取zip文件。对于大小为2MB的文件,我使用以下代码,这几乎需要10秒,这里有没有提高性能的方法

该文件应解压缩并保存在本地系统中

此代码工作正常,除了性能

`一,。如果请求应该从客户端调用,则需要很长时间 我应该什么时候发送回复?如果我能等到这个过程 完成这个可能需要10秒

2.在这种情况下,我是否应该使用承诺?如果是,请提供以下代码的示例(blue bird,q…)

3.有一种方法可以优化性能


代码不是问题,当我运行精确的代码时,提取7.5MB ZIP文件需要750ms。我用这个来计时:

app.post('/', function(req, res) {
  console.time('unzip');
  var ext = unzip.Extract({ path: ... }).on('close', function() {
    console.timeEnd('unzip');
    res.sendStatus(200);
  }).on('error', function(err) {
    console.timeEnd('unzip');
    res.sendStatus(500);
  });
  req.pipe(ext);
});
上载文件:

$ ls -al test.zip
-rw-rw-r-- 1 robert wheel 7553635 Jul 17 09:31 test.zip
$ curl -XPOST localhost:3012 --data-binary @test.zip
这是在Macbook Pro上

你没有说你对代码计时的准确程度,但我的猜测是,从客户端开始上传到,直到收到响应,需要10秒,这会引入很多额外的变量(上传速度、网络连接、Express应用程序中的特定中间件等)

将提取代码与Express完全分开运行,看看这是否真的是瓶颈。下面是一个简单的独立脚本,可用于测试:

var fs    = require('fs');
var unzip = require('unzip');

console.time('unzip');
fs.createReadStream('test.zip').pipe(unzip.Extract({ path : ... })).on('close', function() {
  console.timeEnd('unzip');
});

如果一个2MB文件需要10秒钟,我会认为您的硬件功能严重不足,这是Node.js无法解决的。

您到底想做什么?将压缩后的文件发布到服务器,并动态扩展此文件?@Tobi yeah,请参阅(不同的用户,但明显相似)@Tobi-更正这是我需要的:)我不知道此问题在哪里使用promises、Q或Bluebird?请解压缩客户端上的数据,通过支持zip的协议解压发送,您将在C节点中获得脱离主线程的代码。这也将使您的生活更加轻松,意味着此逻辑不在您的代码中,因为它可以在HTTP级别完成。感谢Robert 1+,我的硬件是i5-4300 1.9 GHZ,带有16GB ram,用于两GB ram,例如,这在您的硬件中需要多少(2mb)?@JhonDree 7.5MB需要不到一秒钟的时间(i7 2.3Ghz,16GB RAM)。你的硬件规格并不意味着瓶颈是硬件。你和postman一起试过吗?我从二进制文件上传zip并保存在我的c驱动器上…只是你试过确切的场景吗?@JhonDree不,我没有用postman,我用的是cURL。请按照我的回答中的说明来计算实际的ZIP提取时间,以排除问题是由此引起的。如果不是,那是另外一个问题,但这可能是你应该在另一个问题中调查的问题。
var fs    = require('fs');
var unzip = require('unzip');

console.time('unzip');
fs.createReadStream('test.zip').pipe(unzip.Extract({ path : ... })).on('close', function() {
  console.timeEnd('unzip');
});