儘管是單線程的,node.js如何更快? 我還沒有運行任何測試來查找統計信息,但在挖掘node.js論壇時,我發現每個人都說它更快,更輕量。但是不管它的重量如何輕微,單線程服務器如何比多線程服務器更快?爲什麼node.js在單線程時速度很快?
回答
首先,爲什麼多線程程序更快?
部分原因是多線程程序可以在多核上運行,但主要原因是,當一個線程正在等待一些IO操作時(這通常是特別在服務器上),其他線程仍然可以進行。
現在,節點呢?
節點不是單線程的。 JS中的用戶腳本在一個線程中執行,但所有IO操作都由引擎和操作系統本地處理,這些線程是多線程。
實際上,這意味着多個請求並行處理。這裏有一個動作可能的序列非常(非常)簡單例子:
user script | node + OS "threads" (libuv)
-------------------------------------------------------------
receive and analyze request 1 |
ask node for file 1 | fetching file 1
receive and analyze request 2 | fetching file 1
ask node for file 2 | fetching file 1, fetching file 2
prepare response header 1 | fetching file 2
tell node to send file 1 | send file 1, fetching file 2
prepare response header 2 | send file 1
tell node to send file 2 | send file 1, send file 2
節點(和io.js)的整個架構簡化了具有並行的較高水平。用戶線程僅由事件循環調用,用於在代碼向節點提供回調時在下一次IO操作時停止的非常短的任務(當然,並非只是IO,而是最常見的),該回調將在操作完成時調用。
當然,這隻適用於使用Node的異步功能。任何時候你使用一個以「Sync」結尾的函數,比如writeFileSync,你就會擊敗並行。
另請閱讀[StrongLoop:爲什麼使節點比Java快](https:// strongloop。com/strongblog/node-js-is-faster-java /) –
感謝你@Denys的解釋和鏈接。它有幫助。 –
的Node.js並非單線程:看https://nodejs.org/about/:
任何連接可以同時
辦理事實上,它不使用系統線程,而是沿着使用V8引擎與libuv庫多線程通過異步回調。
此外,您還可以通過child_process.fork
使用額外的子進程最後,這並不發動機的響應或整體速度的任何條件速度。這裏的多線程可用於可擴展性。
- 1. 在latin1中查詢速度很快,utf8速度慢 - 爲什麼?
- 2. 爲什麼IEnumerable速度慢,List速度很快?
- 3. PHPMailer的Mandrill速度很快,現在很慢,爲什麼?
- 4. 爲什麼我這樣做時我的MySQL查詢速度很快,而當我這樣做時速度很慢?
- 5. 爲什麼查詢速度很慢但SQL Server上的過程很快?
- 6. 爲什麼從Node.js連接到MongoDB的速度很慢
- 7. 爲什麼第一次運行HttpClient速度很慢但速度要快得多?
- 8. 爲什麼python實現miller-rabin的速度比ruby快很多?
- 9. 爲什麼servlet重定向速度很快?
- 10. 爲什麼在Groupon ios應用程序中下載圖片速度很快?
- 11. 爲什麼textchangelistener速度很慢?
- 12. 爲什麼釋放速度很慢?
- 13. 爲什麼反射速度很慢?
- 14. 爲什麼Scrapy速度很慢?
- 15. 爲什麼在.NET中投射速度比反射速度快?
- 16. 爲什麼MySQL在查詢中使用LIMIT時速度很慢?
- 17. 爲什麼Javascript在設置變量時速度很慢?
- 18. 查詢在MySQL中速度很快,但從Rails運行時速度很慢ActiveRecord
- 19. 查詢速度很快,但是當在VIEW中時,速度很慢 - 由於ROW_NUMBER
- 20. MySQL查詢在直接運行時速度很快,但在以存儲過程運行時速度很慢
- 21. 多線程隊列操作不比單線程速度更快
- 22. 快速簡單:爲什麼不運行?
- 23. 爲什麼在Modal Popup Extender中GridView頁面導航速度很快?
- 24. Gulp + Browsersync與SASS速度很快,使用JS的速度很慢
- 25. Hibernate - SQL速度很快,但查詢速度仍然很慢
- 26. 爲什麼我不需要在node.js中快速運行
- 27. 爲什麼快速平方根在Java上很奇慢?
- 28. 爲什麼進程的內存分配速度慢,速度可能會更快?
- 29. 存儲過程運行速度很快,但速度可能很慢
- 30. 爲什麼我的網站在本地主機上速度較慢並且速度很快?
比較快? –
@LaurentB它在服務器上肯定比在瀏覽器中更快...... – Glorfindel
我還有另外一個混亂@DenysSéguret。節點起作用,它啓動一些IO並分配一個回調。現在一旦OS完成該過程,誰調用回調?這是事件循環嗎?如果是的話,比起事件循環來管理那些成千上萬回調的那些數據庫不是一個錯誤嗎?爲什麼事件循環不是多線程的? –