Railsチュートリアルの第4章に以下のような問いがあります。
Rubyのbenchmark-ips gemを使い、ハッシュのキーを「数字」「 文字列」「シンボル」にした際のそれぞれの実行時間を測定してみましょう。
Railsチュートリアル第4章より
4章までの復習兼ねて解いていきます。
まずbenchmark-ips gemをインストールします。
group :development, :test do
(省略)
gem 'benchmark-ips'
end
本番環境ではいらないと思うので、開発・テストのみのインストールとしました。
$ bundle install
上記コマンドだと、インストール済みのものはインストールされず追記したbenchmark-ips gemのみインストールされます。
…
Using ansi 1.5.0 #インストール済みのgemはUsingとなっている
Fetching benchmark-ips 2.10.0 #未インストールなのでフェッチ
Installing benchmark-ips 2.10.0 #からのインストール
Using bindex 0.8.1
…
benchmark-ips gemがインストールできた為、実際に使ってみます。
基本的に以下のような記述で計測ができます。
Benchmark.ips do |x|
x.report{ 計測したい処理 }
end
以下今回書いたプログラムです。
hushes = {1=>"one","1"=>"one", :one=>"one"}
Benchmark.ips do |x|
x.config(:time => 5, :warmup => 2)
x.report{hushes[1]}
x.report{hushes["1"]}
x.report{hushes[:one]}
end
RubyファイルをRails環境で動かす場合、以下コマンドで実行できます。
$ rails runner (ファイル名)
Running via Spring preloader in process 1734
Warming up --------------------------------------
1.291M i/100ms
992.726k i/100ms
1.260M i/100ms
Calculating -------------------------------------
11.237M (± 1.4%) i/s - 56.810M in 5.056730s
9.160M (± 3.2%) i/s - 46.658M in 5.100025s
11.223M (± 0.9%) i/s - 56.679M in 5.050841s
同じ時間内で数字とシンボルが文字列よりも多く処理されることが分かりました。
私の見解ですが、シンボルや数字ってイミュータブルな(変更不可な)オブジェクトなので、その分データの占める領域が狭く、その分呼び出しが早いのではないかと考えます。
逆に、文字列はミュータブルな(変更可能な)オブジェクトなので、ユーザの変更に対応できるよう領域を多めに取っている、つまりその分呼び出しに時間がかかっているのではないでしょうか。