前回の記事で、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_s
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_i n 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
y_tsuda
on Wed 24 Sep 2008
at 17:01