lambda/procを使って読みやすくできる?
今日、ふと思った
今までは、処理を関数で括れば読みやすくなるんじゃないかと思っていた。
でも、1回しか使わないような処理のために、わざわざ関数を作ると逆に読みにくくなるかもしれない。
理由
#腹ぺこの今は、食べ物意外に興味がない。 あいす あひる あめ あめ あいす あめんぼ
右の方が見やすいような気がしない?
つまり、1回しか使わないような処理に対して関数を定義することによって、
本当に必要とされる関数を覆い隠して見えにくくしてしまう恐れがあるような気がする。
…かといって、直接にベタっと書いても見やすくはならない気がする。
そうだ、lambdaがあるじゃないか*1
こんな感じにすれば良い。
#初期値として(1~10)のランダムな並び順の配列が欲しい。 x = lambda{|n| (1..n).to_a.sort_by{|x| rand}}.call(10) #後は、これを引数として渡す。
でも、関数を定義するより重くなったら嫌だな。
lambda、procの生成コストと関数定義のコストを計ってみた。
(あと、生成+実行のコストも)
結果
#生成のみ Rehearsal ------------------------------------------ def 0.140000 0.000000 0.140000 ( 0.136027) lambda 0.030000 0.010000 0.040000 ( 0.036818) proc 0.040000 0.000000 0.040000 ( 0.035462) --------------------------------- total: 0.220000sec user system total real def 0.080000 0.000000 0.080000 ( 0.083628) lambda 0.040000 0.000000 0.040000 ( 0.035706) proc 0.030000 0.000000 0.030000 ( 0.035549) #生成 + 実行 Rehearsal ------------------------------------------ def 0.090000 0.010000 0.100000 ( 0.102805) lambda 0.060000 0.010000 0.070000 ( 0.059437) proc 0.050000 0.000000 0.050000 ( 0.058438) --------------------------------- total: 0.220000sec user system total real def 0.100000 0.000000 0.100000 ( 0.097352) lambda 0.050000 0.010000 0.060000 ( 0.058194) proc 0.050000 0.010000 0.060000 ( 0.058535)
だいたい2倍ぐらい速い。これなら問題なさそう。
(lambdaとprocにも微妙な違いがあるみたいだけど、今回は割愛)
おまけ
計測に、使ったコード
require 'benchmark' #その後、実行も含める Benchmark.bmbm do |x| n=10000 x.report("def ") { n.times { def f; "hoge"; end} } x.report("lambda") { n.times { lambda { "hoge" }} } x.report("proc ") { n.times { proc { "hoge" }} } end
*1:procでも良いかも