作者wwwc (郭大維老師大好人)
看板Ruby
標題[問題] 關於Thread
時間Thu Nov 1 10:08:59 2007
環境:
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)
1F:推 yllan:哇,這不是一成兄嗎 11/01 10:17
2F:推 wwwc:喔喔 樓上高手也在用ruby啊 幫我解答一下 XD 11/01 10:21
3F:推 godfat:這個作法似乎有點詭異 @_@ 何不 join? 11/01 12:33
4F:→ godfat:至於執行時間...不懂,puts 好像就正常,p 怪怪的 11/01 12:37
5F:推 wwwc:puts確實是正常的 但是為何改成p能省下3秒? 11/01 13:11
6F:→ poga:p是呼叫obj.inspect puts是呼叫obj.to_s 大概差在這吧 11/01 13:55
7F:推 godfat:puts a.inspect 也正常,差別應該在實作。晚點會檢查 src 11/01 14:58
8F:推 shelary:我猜是因為CPU被空迴圈吃掉了..所以沒空去執行Thread 11/01 15:51
9F:→ shelary:可以看一下CPU的百分比 11/01 15:52
10F:推 godfat:我大概猜到為什麼了,沒錯,跟 CPU 有關,p 的內部可能有 11/01 17:46
11F:→ godfat:cache 和 sleep, 上面的 p a 改成 sleep 0 會最快 11/01 17:46
12F:→ godfat:既然如此我也懶得翻 src 了... 11/01 17:47
13F:推 wwwc:謝謝各位的回答! 11/01 17:56