我一直在使用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倍?有什么想法吗?
答案 0 :(得分:1)
它完全依赖于 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,我们需要执行相同的额外工作。