shelljs 性能很慢

shelljs performance is slow

我一直在用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

exec stdout /tmp/tmp.w22tyS5Uyu

child exec mktemp -d: 48.812ms

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

看看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 它实际上与您的代码行并没有做同样的事情。

希望对您有所帮助!

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

即使{ silent: true },额外的工作仍然是必要的。 shell.exec() 建立在 child_process.execSync() 之上,后者只有 return 标准输出。我们需要执行相同的额外工作才能 return return 代码和 stderr。