在Node.js同步/asynchronous性能和速度移动100.000 +文件

我试图找出最快的方式,而不影响性能很多同时或asynchronous移动100.000 +文件使用Node.js

我做了同步和asynchronoustesting与3个不同的循环forEach async.eachfor 。 循环迭代不会影响定时结果。 影响性能和速度的最重逻辑是同步或asynchronous移动文件。

testing用例显示,同步renameSync()比20%慢,然后asynchronousrename() 。 同时asynchronousrename()使用3倍以上的CPU能力,然后同步renameSync()


我是否正确地认为使用同步renameSync()会更明智一些,因为asynchronousrename()速度提升并不那么重要,并且等于20%。 虽然asynchronous版本的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) } })