【问题标题】:shelljs performance is slowshelljs性能很慢
【发布时间】:2019-01-06 16:44:31
【问题描述】:

我一直在用shelljs

在我的超快速系统上,我执行以下操作:

var shell = require('shelljs')
const exec = require('child_process').exec

console.time('shell mktemp -d')
shell.exec('mktemp -d', {silent: true})
console.timeEnd('shell mktemp -d')

console.time('child exec mktemp -d')
exec('mktemp', ['-d'], function(error, stdout, stderr) {
  if (error) {
    console.error('stderr', stderr)
    throw error
  }
  console.log('exec stdout', stdout)
  console.timeEnd('child exec mktemp -d')
})

它给出以下执行时间:

shell mktemp -d: 208.126ms

执行标准输出 /tmp/tmp.w22tyS5Uyu

child exec mktemp -d: 48.812ms

为什么 shelljs 慢了 4 倍?有什么想法吗?

【问题讨论】:

  • 您是否查看了 shelljs 代码以了解其工作原理和作用?

标签: node.js shelljs


【解决方案1】:

您的代码示例将 async child_process.exec()sync shell.exec() 进行了比较,这并不完全是公平的比较。我想你会发现 shell.exec(..., { async: true }) 的性能更好一些:这是因为 sync shell.exec() 做了额外的工作来提供实时 stdio,同时仍然捕获 stdout/stderr/return 代码作为其一部分返回值; async shell.exec() 可以免费提供相同的功能。

即使使用{ silent: true },仍然需要额外的工作。 shell.exec() 建立在 child_process.execSync() 之上,它只返回标准输出。我们需要执行相同的额外工作才能返回返回码和标准错误。

【讨论】:

    【解决方案2】:

    看看 shelljs 是如何实现的:

    它完全依赖于 node.js fs 库。这个库是跨平台的,用 C++ 编写,但性能不如 C 语言。更一般地说,你不能在 JS 中拥有你在 C 中获得的性能......

    另一件事,抽象层: 您正在使用 exec(Command) ,其中 Command 是为 C 量身定制的(我认为这里是 Linux C)。机器创建一个线程并在其中执行命令。 使用 shell.js 时,有许多机制可以确保跨平台,并将命令的抽象保留为函数,并将结果保留为变量。查看shell.js中exec的代码: https://github.com/shelljs/shelljs/blob/master/src/exec.js 它与您的代码行并没有真正做同样的事情。

    希望有帮助!

    【讨论】:

      猜你喜欢
      • 2016-07-16
      • 2019-03-22
      • 1970-01-01
      • 2016-06-14
      • 2018-09-07
      • 1970-01-01
      • 2012-08-05
      • 1970-01-01
      • 2015-08-26
      相关资源
      最近更新 更多