【问题标题】:Optimze post call to save performnace优化后调用以节省性能
【发布时间】:2015-10-06 20:37:26
【问题描述】:

我有一个 Node 应用程序,它正在从 rest API 请求中获取 zip 文件。我将以下代码用于 2MB 大小的文件,大约需要 10 秒,这里有提高性能的方法吗?

文件应该被提取并保存在本地系统中...

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

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

2.如果是的话,我应该在这种情况下使用promise吗?您可以提供示例吗?请提供以下代码(蓝鸟,q...)

3.有办法以某种方式优化性能

 var unzip = require('unzip');
    app.post('/', function(req, res) {
        var ext = unzip.Extract({
            path: 'C://myFolder'
        }).on('close', function() {
            res.sendStatus(200);
        }).on('error', function(err) {
            // res.sendStatus(500);
        });
        req.pipe(ext);
    });

【问题讨论】:

  • 你到底想做什么?将压缩文件发布到服务器,并即时提取此文件?
  • @Tobi 是的,见this question(不同的用户,但明显相似)
  • @Tobi - 正确这是我需要的:)
  • 我看不出这个问题在哪里使用了 Promise、Q 或 Bluebird?
  • 在客户端解压数据,通过支持 zip 的协议发送解压后的数据,然后您将使用 Node 中的非主线程代码为您处理它,它'也会让你的生活更轻松,这意味着这个逻辑不在你的代码中,因为它可以在 HTTP 级别完成。

标签: javascript node.js performance express unzip


【解决方案1】:

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

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 解决。

【讨论】:

  • 感谢 Robert 1+,我的硬件是 i5-4300 1.9 GHZ 和 16GB 内存,对于 2 GB 内存,例如在你的硬件中这需要多少(2mb)?
  • @JhonDree 7.5MB 不到一秒(i7 2.3Ghz,16GB RAM)。您的硬件规格并不表明瓶颈是硬件。
  • 你用邮递员试过了吗?我从二进制文件上传 zip 并将它保存在我的 c 驱动器上......只是你尝试了确切的场景吗?
  • @JhonDree 不,我不使用 Postman,我使用 cURL。请按照我的回答中的说明来确定实际 ZIP 提取的时间,以排除问题是由此引起的。如果不是,那就是其他问题,但这可能是您应该在另一个问题中调查的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-08
  • 2021-12-02
  • 2011-06-14
  • 1970-01-01
  • 2016-10-25
  • 2016-12-20
相关资源
最近更新 更多