pack&unpackの処理速度

DBとかに保存するために配列(数値が入ってる)をスカラーに圧縮したい。"joinしてsplit"するのと"packしてunpack"だと後者が絶対早いよなーとか思ったけど、どれくらい早いのか気になったので調べてみた。配列はランダムに作ったほうがいいのかな、、、と思いながらも手を抜いた。

require 'benchmark'
require 'pp'

a = [1, 3, 9, 21, 30, 51, 1000, 3000, 5000, 10000]

n = 10000

Benchmark.bm do |x|
  x.report {n.times {a.join(', ')}}
  x.report {n.times {a.pack('c*')}}
end

b = a.join(', ')
c = a.pack('c*')

Benchmark.bm do |x|
  x.report {n.times {b.split(', ')}}
  x.report {n.times {c.unpack('C*')}}
end

5倍くらい早い感じだった。

/Users/syou6162/ruby% /opt/local/bin/ruby1.9 pack_unpack.rb
      user     system      total        real
  0.090000   0.000000   0.090000 (  0.109446)
  0.020000   0.000000   0.020000 (  0.022801)
      user     system      total        real
  0.040000   0.000000   0.040000 (  0.057055)
  0.020000   0.000000   0.020000 (  0.017488)

初めてのRuby

初めてのRuby