[Groonga-commit] droonga/drnbench at 2359b07 [master] Use more generic name for attributes

Back to archive index

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




More information about the Groonga-commit mailing list
Back to archive index