1. 程式人生 > >javascript後臺執行效率是否比較低?

javascript後臺執行效率是否比較低?

nodejs這個伺服器端javascript框架出現後,很多人質疑其效率是否比較低。這也很正常,因為javascript本來就是是用C編寫的前端指令碼語言,本身依賴直譯器執行,執行效率當然沒有編譯執行的C高??但是不要忘記,php, ruby, python,大家都是解釋型指令碼語言。nodejs在伺服器端後臺使用的是V8引擎,V8在執行之前將JavaScript編譯成了機器碼,而非位元組碼或是解釋執行 它,以此提升效能。更進一步,使用瞭如內聯快取(inline caching)等方法來提高效能。有了這些功能,JavaScript程式與V8引擎的速度媲美二進位制編譯。現在主流的動態語言裡面,執行效率排序大概是 JavaScript > Python > Ruby (假設用常見的直譯器:V8、CPython、MRI)。下文還有更深刻的例子,摘自知乎http://www.zhihu.com/question/19653241。

總而言之,你可以看到,作為伺服器,nodejs是足夠快了。其在解決高併發訪問方面相對php有相當優勢,npm模組化令其安裝方便,因而現在已經有很多公司企業採用Nodejs進行開發,github的node專案上詳細列舉了使用node開發的程式https://github.com/joyent/node/wiki/Projects,-Applications,-and-Companies-Using-Node,我認為從09年到現在,node可以說已經是比較成熟的技術方案了。

但是,nodejs主要解決的是併發訪問問題,對大規模伺服器端計算並沒有特別的優化。這裡javascript的確有些弱勢,
其一:javascript這類弱型別解釋型語言,計算效率不高。例如計算最大質數的問題,javascript比java要慢1,2個數量級 ,這還不算浮點數精度差異。(事實上,計算最大質數的問題一般都是都是用C語言+分散式計算來處理。)
其二:nodejs是單執行緒的,任何 CPU密集型操作會削弱掉 Node通過事件驅動、非同步 I/O 模型等等帶來的在吞吐量上的優勢,因為當執行緒被非非同步的高計算量佔用時任何傳入的請求將被阻塞。 這意味著喪失了node的高併發優勢,同時帶來高延時。

對此的解決方法,有兩種:
其一:可以對於關鍵計算的模組,可以採用java甚至C/C++來寫。將繁重的計算轉移到更合適的語言寫的後臺程序來處理,同時讓他們通過像 RabbitMQ 那樣通過訊息佇列伺服器來進行通訊,這是最常見的做法。(我坦言C/C++我寫不了,沒有經驗)
其二:涉及到伺服器上多核併發處理,Node 的核心團隊已經使用 cluster 模組的形式在這一方面做了一些工作 (參考:http://nodejs.org/api/cluster.html)。當然,也可以很容易的通過 nginx 的反向代理執行多個 Node.js 的伺服器例項來避免單一執行緒阻塞的問題。這樣的設定有很高的可擴充套件性,例如一開始的時候可以在一臺伺服器上執行多個例項,等計算量大時就可以分配到多個節點伺服器上執行。用 Node.js 你可以得到很高的吞吐量,每個請求都作為一個小任務非常迅速和高效地處理。