shelljs表现很慢

时间:2017-09-06 23:19:00

标签: node.js shelljs

我一直在使用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倍?有什么想法吗?

2 个答案:

答案 0 :(得分:1)

了解shelljs的实现方式: enter image description here

它完全依赖于 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 它与你的代码行并没有真正做同样的事情。

希望有所帮助!

答案 1 :(得分:1)

您的代码示例将异步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()之上,后者仅返回标准输出。为了返回返回代码和stderr,我们需要执行相同的额外工作。