Kouhei Sutou
kou****@clear*****
Fri Oct 11 11:08:02 JST 2013
In <52575A0A.3010604 �� clear-code.com> "Re: [Groonga-commit] droonga/drnbench �� 2359b07 [master] Use more generic name for attributes" on Fri, 11 Oct 2013 10:53:14 +0900, Kenji Okimoto <okimoto �� clear-code.com> wrote: > 破壊的なメソッドを使っているので速度を求めているのだと思いますが、要素数が多い場合は、 > sort_by を使った方が速いです。 > 要素数が少ないと、違いを実感できないですが、ここがもしボトルネックになっているなら > sort_by を試してみてください。 ちょっと語弊があるので補足すると。。。 必ずしもsortよりsort_byの方が速くなるわけではないので注意し てください。sort_byの方が速くなるのは、ざっくり言うと「要素そ のもので比較しないときだけ」です。今回のように要素そのもので ソートしている場合はsortの方が速いです。 http://ruby-doc.org/core-2.0.0/Enumerable.html#method-i-sort_by require 'benchmark' a = (1..100000).map { rand(100000) } Benchmark.bm(10) do |b| b.report("Sort") { a.sort } b.report("Sort by") { a.sort_by { |a| a } } end produces: user system total real Sort 0.180000 0.000000 0.180000 ( 0.175469) Sort by 1.980000 0.040000 2.020000 ( 2.013586) ↑の例ではsortの方が1桁速いです。 ↓のようにブロックの中でなにか処理をする場合はsort_byの方が 速くなることが多いです。 sort {|a, b| a.なにかのメソッド <=> b.なにかのメソッド} sort_by {|x| x.なにかのメソッド} というのも、sort_byの方は要素の数しか「なにかのメソッド」を 実行しないのに、sortの方は要素の数より多く「なにかのメソッド」 を実行するからです。この「なにかのメソッド」が重ければ重いほ どsort_byの方が速くなっていきます。 なので、 > sort_by の方が速いのは sort! よりも比較の回数が減るからです。 というのは少し違って、比較の回数は同じなんですが、比較する前 の前処理を実行する回数が減るからです。 ↑については↓でも触れられているので参考にしてください。 http://rurema.clear-code.com/2.0.0/method/Enumerable/i/sort_by.html