我明白,在YARV上運行的Ruby中,線程是指併發而不是並行。我的問題是:單獨使用併發可以提高性能的情況是什麼?例如,我可以想象,在同時處理多個IO流時,併發會提高性能 - 如果一個任務很慢,那麼並不意味着堆棧中的所有下一個任務都必須等待該任務完成。我對嗎?還有其他類似的情況嗎? [hopes that YARV will ever remove the GIL]/[overhead of creating threads with the GIL]
比率現在是否開始在Ruby中使用線程?併發性可以提高性能嗎?
回答
如果您有多個任務需要等待一些不經常發生的外部刺激(例如,網絡數據變爲可用,磁盤讀取完成等),那麼併發會非常有益。如果您只是坐在在循環中,等待這些操作中的一個發生,你要麼
- 等待很長一段時間,一些單一的事件來完成,而另一些已經完成,正在等待着你去看看他們,或
- 浪費CPU能量循環數百個不同的事件,這些事件沒有被觸發,尋找實際已經觸發的事件。
併發性在設計固有事件驅動的程序時也很有用,例如等待不同的UI事件發生。在這種情況下,您可以指定響應不同UI事件觸發的任務,並且處理器可以處於休眠狀態或處理其他任務,而無需顯式等待未觸發的任務運行。只要事件發生,那些線程就可以喚醒並共享CPU處理時間。
希望這會有所幫助!
感謝您的回答。我有一個更具體的問題 - 讓我們說一個應用程序執行一堆高度遞歸的樹操作。同樣,僅使用併發性,通過基於子樹大小的線程之間的「負載均衡」操作,是否可以實現更高的性能?我猜測這可能會提高性能,例如,如果一些零星的葉子需要處理不成比例的類型。但是,如果運營的時間成本縮減,例如,與葉子的數量成線性關係,性能是否會增加? – user2398029 2012-02-13 23:18:36
通常,併發只能幫助你,如果操作被某些外部操作阻止,而不是如果它們花費很多時間。樹搜索中所有操作的總時間是一個常量,並且如果您將這些工作在各個線程之間進行混洗,則不太可能有所幫助。 I/O操作變得更快的原因是CPU可以在其他線程的「等待時間」內工作,基本上填補了處理時間的空白。 – templatetypedef 2012-02-14 00:25:08
好的,這就是我的想法 - 非常感謝。 – user2398029 2012-02-14 00:28:22
Ruby模型運行良好的一種情況是當您使用Ruby驅動其他應用程序時。例如,如果你產生了,比如編譯,你可以讓一個Ruby線程處理一個外部進程。
另一件好事是,它允許您將應用程序劃分爲邏輯部分,並讓一個線程處理每個部分。這樣做只使用一個線程可能會要求您編寫更復雜的應用程序。
- 1. const-correctness可以提高性能嗎?
- 2. jni可以提高反射性能嗎?
- 3. CTE能提高性能嗎?
- 4. 通過併發提高仿真性能
- 5. 緩存是否可以提高性能?
- 6. 模擬退火 - 可以提高性能?
- 7. 哪種方法可以提高性能?
- 8. 數據庫設計和性能:使用冗餘FK提高性能可以嗎?
- 9. WPF VirtualizingStackPanel以提高性能
- 10. java +提高性能和可伸縮性
- 11. 使用PHP7可以提高oci8性能嗎?
- 12. 使用具有SpriteBatch的靜態Texture2D可以提高性能嗎?
- 13. DbLinq的對象跟蹤性能可以提高嗎?
- 14. 強類型數據集可以提高性能嗎?
- 15. CUDA,可以使用共享內存提高我的性能嗎?
- 16. 這個畫布drawImage()測試的性能可以提高嗎?
- 17. 統一列可以提高查詢性能嗎?
- 18. C中的static關鍵字可以用來提高性能嗎?
- 19. 多線程可以提高性能嗎?怎麼樣?
- 20. 可以通過模塊/靜態類來提高ASP.NET性能嗎?
- 21. 在Order By中使用MATH可以提高性能嗎?
- 22. 你可以提高sqlserver視圖的性能嗎?
- 23. 生成列表可以提高Python的性能嗎?
- 24. 我可以使用glscissor提高性能嗎
- 25. 提高性能
- 26. 提高性能
- 27. 提高性能
- 28. 提高性能
- 29. 提高性能
- 30. 提高性能
你是對的猜測 – Adrian 2012-02-13 19:57:33
對於未來的讀者來說,[this](http://www.engineyard.com/blog/2010/concurrency-real-and-imagined-in-mri-threads/)的帖子是非常很有幫助。 – user2398029 2012-02-15 01:47:56