• 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)
ruby>>
ip_addrs.sort_by{|a| a.split(".").map{|i| "%3d" % i.to_i}}
<<ruby

②自分で書いたソート・改(以下, my_sort_2)
ruby>>
ip_addrs.sort_by{|a| a.split(".").map{|i| i.to_i}}
<<ruby

③takiuchiさんに教えていただいたソート(以下, takiuchi_sort)
ruby>>
ip_addrs.sort_by{|i| Socket.sockaddr_in nil, i}
<<ruby

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

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

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

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

そして、ベンチマークをとってみます。
-コード
ruby>>
require 'benchmark'
Benchmark.bm do |x|
x.report("my_sort_1 :"){ ip_addrs.sort_by{|a| a.split(".").map{|i| "%3d" % i.to_i}}}
x.report("my_sort_2 :"){ ip_addrs.sort_by{|a| a.split(".").map{|i| i.to_i}}}
x.report("takiuchi_sort:"){ ip_addrs.sort_by{|i| Socket.sockaddr_in nil, i}}
end
<<ruby

-結果
ruby>>
user system total real
my_sort_1 : 3.860000 1.160000 5.020000 ( 5.017623)
my_sort_2 : 2.170000 0.650000 2.820000 ( 2.819594)
takiuchi_sort: 0.690000 0.180000 0.870000 ( 0.864372)
<<ruby

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

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

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

こんな感じで、結論としては、
takiuchiさんの、
ruby>>
ip_addrs.sort_by{|i| Socket.sockaddr_in nil, i}
<<ruby
がベンチマーク的に優秀で、コードの見た目もシンプルでかなり良さげです!!

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

posted by y_tsuda y_tsuda on Wed 24 Sep 2008 at 17:02 with 0 comments
Contents rssrss
Xperiaにインストールして1週間生き残ったアプリたち
gem serverをIE8から見るとヒドイことになる現象を解決
gem serverをIE8から見るとヒドイことに
Twitter, Account Suspended
GentooにRuby1.9をインストールした
GentooにScalaをインストールしてみた
多面ディスプレイ環境を手作りしてみた
lower-camel caseな文字列とアンダースコア区切りな文字列の相互変換をRubyで
topコマンドでのCPUコア毎の表示
Fedora11 (on VirtualBox) 速効レビュー
Tags
rubyGentooDIYFedoralinuxmemoScalatwitterunixvirtualboxweb
Comments rssrss
rysonqem rysonqem: something new and exciting rysonqem http://www.g2... 04/23 23:37
cvcwcbbfp cvcwcbbfp: something new and exciting [url=http://www.g1h6r6... 04/10 13:40
Aleksey Aleksey: The uname check is only due to a somewhat sloppy t... 02/02 07:03
Yu Tsuda Yu Tsuda: あぁ、そうですね、、syncすると戻ってしまいますね・・・。 ご指摘ありがとうございます!! 07/11 15:38
ursm ursm: /usr/portage 以下のファイルは更新のたび元に戻ってしまうので、/etc/portage/... 07/11 13:46
Yu Tsuda Yu Tsuda: 見た目だけでも、わざわざGentooをこういうリストに入れてるのがすごいなぁと思ったりしたのです(笑... 03/31 19:49
Leonard Chin (レオ) Leonard Chin (レオ): ただし、VirtualBoxで「Gentoo」などを選択しても、別にどのOSを入れても大丈夫だ。あく... 03/31 13:00
Yu Tsuda Yu Tsuda: この機能、結構便利なんですよねー。 またEmacsで便利な機能を見つけたらブログに書きまーす。 11/27 23:46