0
0

More than 1 year has passed since last update.

【Railsチュートリアル】benchmark-ips gemで処理の実行速度を計測してみる

Posted at

Railsチュートリアルの第4章に以下のような問いがあります。

Rubyのbenchmark-ips gemを使い、ハッシュのキーを「数字」「 文字列」「シンボル」にした際のそれぞれの実行時間を測定してみましょう。
Railsチュートリアル第4章より

4章までの復習兼ねて解いていきます。

まずbenchmark-ips gemをインストールします。

Gemfileへ追記
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で実行
$ 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

同じ時間内で数字とシンボルが文字列よりも多く処理されることが分かりました。
私の見解ですが、シンボルや数字ってイミュータブルな(変更不可な)オブジェクトなので、その分データの占める領域が狭く、その分呼び出しが早いのではないかと考えます。

逆に、文字列はミュータブルな(変更可能な)オブジェクトなので、ユーザの変更に対応できるよう領域を多めに取っている、つまりその分呼び出しに時間がかかっているのではないでしょうか。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0