2011-10-23 70 views
0

我正在玩Node.js作爲一些建設時間JavaScript優化的驅動程序。我的概念誤解節點異步是錯誤的嗎?

我有以下傑克文件:

fs = require("fs") 
uglify = require("uglify-js") 
desc "Uglify JS" 

bundles = 
    edit: [ "jquery",.... ] 
    login: [ ... ] 
    directory: [ .... ] 

all = {} 
task "minify", [], (params) -> 
    files = bundles.edit 
    for name,files of bundles 
    all[name] = "" 
    files.forEach (file, i) -> 
     file = file + ".js" 
     all[name] += fs.readFileSync("Src/Scripts/" + file).toString() if file.match(/^.*js$/) 
     cbgen = (data) -> 
      (err, out) -> 
        ast = uglify.parser.parse(data) 
        ast = uglify.uglify.ast_mangle(ast) 
        ast = uglify.uglify.ast_squeeze(ast) 
        fs.write out, uglify.uglify.gen_code(ast), 0, null, null, (e,w) -> 
     cb = cbgen all[name] 
     fs.open "Src/Scripts/" + name + ".min.js", "w+", 0666, cb # async methods 

,你可以在最後一行看到,我所做的腳本異步的昂貴的部分。

但是當我運行它,它只是使用可用的CPU處理能力的12%,所以兩個問題:

  1. 我是不是做錯了
  2. 如果沒有,哪來的上漲空間?
+0

它應該使用內部線程池(在Linux上)或IOCP在Windows上。但是,V8 JavaScript代碼只在一個線程中。 – Raynos

回答

1

我不認爲你的理解是關閉的,在這個例子中沒有什麼好處。 Uglify/js縮小嚴重限制CPU(解析,ast操縱等),所以我希望節點能夠有效地連續運行這些操作。

如果不等待,Node將使用它已分配的100%的CPU。如果你看到它使用大約12%,那麼你的機器可能有8個核心,節點佔據其中的一個。

構建腳本可能沒什麼意義,但如果真的想要以最佳方式運行,可以確保所有IO(在這種情況下爲讀取文件)異步完成併產生一個單獨的進程來執行uglification,以便每個捆綁可以並行完成。