【发布时间】:2017-10-12 14:55:54
【问题描述】:
我正在尝试找出最快的方法,同时使用 Node.js 同步或异步移动 100.000 多个文件时不会对性能产生太大影响
我使用 3 个不同的循环 forEach async.each 和 for 进行了同步和异步测试。循环迭代对时序结果的影响不大。影响性能和速度的最大逻辑是同步或异步移动文件。
测试用例显示,同步 renameSync() 比异步 rename() 慢 20%。同时异步 rename() 使用 3 倍的 CPU 功率,然后是同步 renameSync()。
我是否正确假设使用同步 renameSync() 会更明智,因为异步 rename() 中的速度提升并不那么显着,等于 20%。虽然异步版本中的 CPU 使用开销似乎很大 - 300%?
还是我错过了什么?也许在速度/性能方面有更好的解决方法。
时间安排:
eachAsyncRenameAsync()
node rename.js 1.60s user 11.20s system 280% cpu 4.559 total
node rename.js 1.65s user 11.82s system 284% cpu 4.732 total
node rename.js 1.64s user 11.84s system 292% cpu 4.606 total
eachSyncRenameSync()
node rename.js 0.69s user 5.01s system 97% cpu 5.851 total
node rename.js 0.67s user 4.88s system 97% cpu 5.687 total
node rename.js 0.68s user 5.01s system 99% cpu 5.734 total
eachAsyncRenameSync()
node rename.js 0.67s user 4.99s system 97% cpu 5.797 total
node rename.js 0.68s user 4.95s system 97% cpu 5.754 total
node rename.js 0.66s user 4.89s system 97% cpu 5.690 total
eachSyncRenameAsync()
node rename.js 1.63s user 11.12s system 274% cpu 4.638 total
node rename.js 1.66s user 12.29s system 286% cpu 4.874 total
node rename.js 1.66s user 12.23s system 289% cpu 4.795 total
forSyncRenameAsync()
node rename.js 1.72s user 12.04s system 283% cpu 4.862 total
node rename.js 1.69s user 11.88s system 276% cpu 4.904 total
node rename.js 1.64s user 11.89s system 287% cpu 4.712 total
forSyncRenameSync()
node rename.js 0.64s user 4.94s system 97% cpu 5.715 total
node rename.js 0.66s user 5.01s system 97% cpu 5.807 total
node rename.js 0.65s user 4.93s system 99% cpu 5.616 total
代码:
const fs = require('fs')
const path = require('path')
const { each } = require('async')
let dir = '/opt/bin/test/Random 100000'
let dir2 = '/opt/bin/test/Random 100000 2'
function eachAsyncRenameAsync(files) {
each(files, file => {
fs.rename(path.join(dir,file), path.join(dir2,file), err => {
if(err) { console.log(err) }
})
})
}
function eachSyncRenameSync(files) {
files.forEach(file => {
fs.renameSync(path.join(dir,file), path.join(dir2,file))
})
}
function eachAsyncRenameSync(files) {
each(files, file => {
fs.renameSync(path.join(dir,file), path.join(dir2,file))
})
}
function eachSyncRenameAsync(files) {
files.forEach(file => {
fs.rename(path.join(dir,file), path.join(dir2,file), err => {
if(err) { console.log(err) }
})
})
}
function forSyncRenameAsync(files) {
for (i=0; i<files.length; i++) {
fs.rename(path.join(dir, files[i]), path.join(dir2, files[i]), err => {
if(err) { console.log(err) }
})
}
}
function forSyncRenameSync(files) {
for (i=0; i<files.length; i++) {
fs.renameSync(path.join(dir, files[i]), path.join(dir2, files[i]))
}
}
// Reading dir asynchronously and moving files
fs.readdir(dir, (err, files) => {
if (err) { console.log(err) }
else {
console.log('eachAsyncRenameAsync()')
eachAsyncRenameAsync(files)
}
})
【问题讨论】:
标签: javascript node.js performance asynchronous node-async