Re: [心得] Generator 與 Continuation
跑個測試程式,測試程式如下:
require 'test/unit'
require 'benchmark'
class TC_Generator < Test::Unit::TestCase
def test_benchmark
Benchmark.bmbm{|b|
test = lambda{|klass|
atest_block1 klass
atest_block2 klass
atest_each klass
}
b.report('orig'){
50.times{ test.call Generator }
}
b.report('hack'){
50.times{ test.call MyGenerator }
}
}
end
end
其中的 atest_ 開頭的 method 定義是放在 generator.rb 裡的那些,
我在開頭多加了個 a 以避免去跑那些測試,全部拉到 test_benchmark 裡測試。
測試連續呼叫五十次這些 method, 哪個 Generator 比較快?
在我的小電腦上,跑起來的結果是:
Loaded suite ./perform
Started
Rehearsal ----------------------------------------
orig 1.382000 0.070000 1.452000 ( 1.462000)
hack 0.951000 0.200000 1.151000 ( 1.171000)
------------------------------- total: 2.603000sec
user system total real
orig 0.891000 0.030000 0.921000 ( 0.942000)
hack 0.591000 0.000000 0.591000 ( 0.591000)
.
Finished in 4.676 seconds.
1 tests, 10800 assertions, 0 failures, 0 errors
第一個 Rehearsal 的結果可以不用看,那個不太準…。
雖然我一直不太懂分這麼多時間到底是什麼意思…?
不過看起來應該是有快上一些吧。
之所以會貼這篇是因為,剛剛在 ruby-talk 上看到這個問題
已經變成 RubyQuiz 了 O_o
看來 gernerator 的慢早就被很多人看不爽了…。
那邊有很多人貼他的結果,我懶得一一測了,所以只測自己的。
其中有不遵守 lazy 原則的,直接用 array, 這樣不公平啦。
還有人用 Thread 來做…感覺用 Thread 來做應該不錯,
不過暫時懶得試試看。
另外是聽說官方有正式推出比較快的實作,也許會包在下個版本裡。
--
『風車』が廻り続ける度に 『美しき』幻想が静かに紡がれ
『焔』の揺らめきの外に 『腕』を伸ばす愚かな者達 -《Roman》5th Story
『宝石』をより多く掴もうと 『朝と夜』の狭間を彷徨い続ける Track 10
『星屑』の砂の煌めきにも 『葡萄酒』の仄甘い陶酔を魅せ 黄昏の賢者
『賢者』が忌避する檻の中から 『伝言』の真意を彼等に問うだろう
『天使』が别れを告げし時 『地平線』は第五の物語を識る
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.132.58.12
討論串 (同標題文章)
完整討論串 (本文為第 2 之 2 篇):
Ruby 近期熱門文章
PTT數位生活區 即時熱門文章