【问题标题】:Do multiple callback reduce nodejs performance?多个回调会降低nodejs的性能吗?
【发布时间】:2018-03-28 16:35:18
【问题描述】:

我正在使用 mysql 开发一个快速应用程序。我的节点版本是 6.11.2。

我的路由器文件是

const router = require("express").Router();
const project = require("../../modules/project/");

// individual project routes
router.get("/", project.getAllProject);

现在我的getAllProject函数代码如下。

  /* Get all project  */
  getAllProject(req, res, next) {
    buildQuery(req) /* Build query based on logged in user */
      .then(query => runDbQuery(req, query)) /* execute query */
      .then(results => formatResult(results)) /* Build response for front end */
      .then(output => res.send(output)) /* return results */
      .catch(err =>
        next(err, req, res, next)
      ); /* catch error and pass it error middle ware */
  }

buildQuery、runDbQuery、fromatResult 返回承诺。

在我的代码审查客户评论如下

在您这里称为“getAllProjects”的方法中 在数据交付之前需要进行 3 次回调检查,总共需要 4 次回调。这太多了。这很慢,因为这些 需要完成回调才能将数据发送到占用服务器处理能力的客户端

他还要求我在一个回调中完成所有操作并将数据返回给客户端。承诺和回调方法会降低性能。他还建议在 express 中使用 RXJS Observable。

【问题讨论】:

  • 你必须指定更多细节,比如这些函数的作用@shameersn
  • @Sumeet buildQuery 返回 sql 查询字符串,runDbQuery 执行 buildQuery 返回的 mysql 查询,formatResult 从 mysql 结果创建一个 json。这些函数根据某些条件解析或拒绝,例如,如果有一个 mysql 执行错误,那么它将拒绝错误,否则解析结果。我正在使用 msql 包来执行 mysql 查询
  • @Sumeet 问题是关于单一 vs 多个 .then() 方式,而不是他们所做的工作
  • 在我看来,代码中包含多少回调或承诺并不是性能的关键因素。如果为了可读性和可维护性而需要拆分功能,那是非常值得的。 Rxjs 并没有解决这样的问题,你仍然会在多个平面图或一个大函数之间做出选择
  • @FanCheung 谢谢

标签: node.js express callback promise rxjs


【解决方案1】:

理论上,每个函数调用都会消耗一些资源(如上下文/闭包构造)。所以,是的,根据定义,拥有三个 .then() 比单个 .then() 慢,即使在这两种情况下都在 then-s 中完成相同的工作。

真的很难告诉 多少在没有运行基准的情况下,与单次情况相比,多时情况要慢...所以,我创建了一个 simple one,你可以自己试试吧。

在我的旧笔记本电脑上,基准测试的结果如下所示:

希望,这回答了你的问题。


现在,性能并不是代码评估的唯一标准。另一个是可读性。在某些情况下,如果您有多个 .then() 调用,您的代码会看起来更具可读性,其中每个调用都声明了一个特定的数据转换步骤。只是一个旁注。 个人更喜欢可读性而不是性能,因为对我来说,它选择正确性高于性能的机会。您的客户可能会有不同的想法。


Observable 而言,您可能想也可能不想使用它们。这取决于您的应用程序的性质。 Observable 在事件流和操作方面非常出色。 Promises,然而,与 ES6 的 await/async 功能一起摇滚。所以,这里没有明确的答案,除非我们对上下文有更多了解。

【讨论】:

  • 谢谢。现在我不得不牺牲可读性来换取性能和客户满意度
  • @shameersn 不要生气。这是我们工作的一部分。无论如何,这是客户的电话;再加上客户是付钱的人……
  • 亲爱的选民,你能解释一下我的回答有什么问题吗?
猜你喜欢
  • 1970-01-01
  • 2018-12-12
  • 1970-01-01
  • 1970-01-01
  • 2011-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-25
相关资源
最近更新 更多