看板 Ruby 關於我們 聯絡資訊
環境: ruby 1.8.6 (2007-06-07 patchlevel 36) [i486-linux] 狀況: 爬文得知ruby沒有native thread,但必須做類似下列的工作, 卻發生非預期性的結果 附錄: a = 0 start = Time.new t = Thread.new{ while a < 10000000 a += 1 end } while(a < 5000000) #p a end puts Time.new - start #a >= 5000000後的code 輸出的結果大約是6.2秒 但若將第二個迴圈內的註解拿掉 也就是改成 while(a < 5000000) p a end 其他維持原狀 輸出的結果竟然是3.2秒 反而快了3秒!? 有什麼合理的解釋嗎? 因為希望等到a >= 5000000後再繼續執行下面的工作 所以才讓他跑空迴圈... 該怎麼改能更有效率的達到上述要求? 小弟是ruby新手 請不吝賜教 感謝! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.109.23.118 ※ 編輯: wwwc 來自: 140.109.23.118 (11/01 10:09)
yllan:哇,這不是一成兄嗎 11/01 10:17
wwwc:喔喔 樓上高手也在用ruby啊 幫我解答一下 XD 11/01 10:21
godfat:這個作法似乎有點詭異 @_@ 何不 join? 11/01 12:33
godfat:至於執行時間...不懂,puts 好像就正常,p 怪怪的 11/01 12:37
wwwc:puts確實是正常的 但是為何改成p能省下3秒? 11/01 13:11
poga:p是呼叫obj.inspect puts是呼叫obj.to_s 大概差在這吧 11/01 13:55
godfat:puts a.inspect 也正常,差別應該在實作。晚點會檢查 src 11/01 14:58
shelary:我猜是因為CPU被空迴圈吃掉了..所以沒空去執行Thread 11/01 15:51
shelary:可以看一下CPU的百分比 11/01 15:52
godfat:我大概猜到為什麼了,沒錯,跟 CPU 有關,p 的內部可能有 11/01 17:46
godfat:cache 和 sleep, 上面的 p a 改成 sleep 0 會最快 11/01 17:46
godfat:既然如此我也懶得翻 src 了... 11/01 17:47
wwwc:謝謝各位的回答! 11/01 17:56