1

我一直在使用 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')
})

它给出了以下执行时间:

外壳 mktemp -d:208.126 毫秒

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

子执行 mktemp -d:48.812 毫秒

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

4

2 回答 2

3

您的代码示例将 asyncchild_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(),它只返回标准输出。我们需要执行相同的额外工作才能返回返回码和标准错误。

于 2019-01-06T08:44:31.523 回答
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 它并没有真正做与您的代码行相同的事情。

希望有帮助!

于 2017-09-07T00:14:35.970 回答