マージソート続き
ブロックが渡せなかった理由
ブロックがうまく渡せなかった理由は、関数をネストしていたからみたい。
どうしてそうなるかは追えてない(あとで調べる)
速度向上。
コードを見ていると、意味もなく何回もlambda(もしくはunless)が呼ばれている。*1これを外に出してしまえば、もう少し早くなるかもしれない。
ということでコードを修正
class Array def merge_sort2(a=self,&block) cond = lambda { |a,b| a <= b} unless block m_s(a,&cond) end def m_s(a,&cond) return a if a.size <= 1 #ブロックの部分の記述削除 ... end def merge(left,right,&cond) ... end end
結果
user system total real ms2 1.080000 0.190000 1.270000 ( 1.272517) ms 1.650000 0.230000 1.880000 ( 1.880838)
少し早くなった。
*1:cond = lambda { |a,b| a <= b} unless blockの部分