Rubyでrequireのコストが無視できない場合はautoloadが使える
タグ: ruby / 初版公開: 2013-11-22

昨日に引き続きRubyのreuiqreに関する話題である。

requireは実行された時に参照先を即座に読み込んでしまう。そのためrequireする対象が非常に大規模な場合、requireにかかる時間やリソースが問題になる場合がある。そのような場合はautoloadが助けになるかも知れない。

autoloadはクラスやモジュールが実際に参照されるまで参照先の読み込みを行わない。頻繁に起動を繰り返すようなプログラムで、ごく稀にしか参照先を実際に実行しない場合などで、時間とリソースを節約することができる。

autoloadの効果を確かめるために、少しプログラムを書いてみることにする。例えば以下のようなディレクトリ構造があるとしよう。

  • hoge.rb
  • lib
    • piyo.rb

ここでpiyo.rbは以下の内容として、ロードされると同時にメッセージを出力するようにする。

class Piyo
	puts "Piyo was loaded."
end

hoge.rbの内容は以下とする。 もし1が入力された場合はPiyoを参照し、それ以外であれば何もせずに終了する。

autoload :Piyo, "lib/piyo"

if gets.to_i == 1
	Piyo
else
	# 何もしない
end

これを実行してみると以下のようになる。 確かにPiyoが参照された時だけ、Piyoが実際にロードされることがわかる。

$ ruby hoge.rb
1
Piyo was loaded.
$ ruby hoge.rb
0