• 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

前回の記事で、IPアドレスのソートについて書きました。

今回はその続きで、takiuchiさんに教えてもらったものや、自分で書いたものの性能比較をしようと思います。

まず、前回の記事&コメントでどのようなソート方法があったかというと、

①自分で書いたソート(以下, my_sort_1)

   1  ip_addrs.sort_by{|a| a.split(".").map{|i| "%3d" % i.to_i}}

②自分で書いたソート・改(以下, my_sort_2)

   1  ip_addrs.sort_by{|a| a.split(".").map{|i| i.to_i}}

③takiuchiさんに教えていただいたソート(以下, takiuchi_sort)

   1  ip_addrs.sort_by{|i| Socket.sockaddr_in nil, i}

の3つです。 これらについて、ベンチマークをとってみます。

ソートする対象としては、世界の国別 IPv4 アドレス割り当てリストを使いました。

まず、下準備として、上記リストには、サブネットマスク版とCIDR表記版があるので、ここからIPアドレスのみを抽出し、Array型のオブジェクトに格納ておきます(このオブジェクトをip_addrsとする)。

全部で、51814のIPアドレスがあるらしいです。

そして、ベンチマークをとってみます。 -コード

   1  require 'benchmark'
   2  Benchmark.bm do |x|
   3    x.report("my_sort_1    :"){ ip_addrs.sort_by{|a| a.split(".").map{|i| "%3d" % i.to_i}}}
   4    x.report("my_sort_2    :"){ ip_addrs.sort_by{|a| a.split(".").map{|i| i.to_i}}}
   5    x.report("takiuchi_sort:"){ ip_addrs.sort_by{|i| Socket.sockaddr_in nil, i}}
   6  end

-結果

   1        user     system      total        real
   2  my_sort_1    :  3.860000   1.160000   5.020000 (  5.017623)
   3  my_sort_2    :  2.170000   0.650000   2.820000 (  2.819594)
   4  takiuchi_sort:  0.690000   0.180000   0.870000 (  0.864372)

takiuchiさんに教えていただいたソートが圧倒的に速いですね!! ここまで差がでるとは、正直思っていなかった。

自分で書いたmy_sort_1とmy_sort2でもかなりの差がみられました。

まぁ、my_sort_1のほうは無駄が多いですしね・・・。

こんな感じで、結論としては、 takiuchiさんの、

   1  ip_addrs.sort_by{|i| Socket.sockaddr_in nil, i}
がベンチマーク的に優秀で、コードの見た目もシンプルでかなり良さげです!!

他に「こんな方法のソートがあるよ!」というのがあれば、教えていただけると嬉しいです!

posted by Png y_tsuda on Wed 24 Sep 2008 at 17:01

Comments:

or Preview
Social Bookmarks
  • Delicious
  • B_entry903
  • Clip_16_12_w
Services from s21g
twpro(ツイプロ)
Twitterプロフィールを快適検索
地価2009
土地の値段を調べてみよう
MyRestaurant
自分だけのレストラン手帳
Formula
ブログに数式を埋め込める数式コミュニティ