RubyのIO.getcが遅い件
IO.readで比較、IO.getcで比較、最後に両ファイルのMD5を計算という実験をしてみました。
getc >>> read > MD5 と予想してたのに、結果はread > MD5 >>>>>>>>>> getcといった感じに。
以下は220MBの同一ファイルを比較したときの速度。
1回 | 2回 | 3回 | 4回 | 5回 | 平均 | |
---|---|---|---|---|---|---|
read | 1.55247 | 3.064115 | 3.240504 | 3.265657 | 3.259735 | 2.8764962 |
getc | 145.975028 | 146.703321 | 148.11222 | 145.655821 | 145.559771 | 146.4012322 |
MD5 | 2.815759 | 4.647561 | 4.666489 | 4.563829 | 4.646109 | 4.2679494 |
readとgetcで50倍の差が出るとは予想外。書き方が悪いのかな。
とりあえず、ファイル比較にはread使うのが良さそう。
def bineql_read?(f1, f2) open(f1, "rb") do |io1| open(f2, "rb") do |io2| return false if io1.read != io2.read end end return true end def bineql_getc?(f1, f2) open(f1, "rb") do |io1| open(f2, "rb") do |io2| while c1 = io1.getc return false if c1 != io2.getc end end end return true end p Digest::MD5.hexdigest(File.open(f1).read ) p Digest::MD5.hexdigest(File.open(f2).read )