Hatena::ブログ(Diary)

[サ]ロンパスの日記 このページをアンテナに追加 RSSフィード

08-02-27

[]requireとautoloadについて 16:31 requireとautoloadについてを含むブックマーク requireとautoloadについてのブックマークコメント

今日はRubyの話です。

main.rb

#!ruby
require 'hoge'

こうすると、hoge.rbの中身が全部読み込まれて、main.rbの中で使えるようになります。

main.rb

#!ruby
autoload(:Hoge, 'hoge')

このままでは、main.rbのなかでhoge.rbは読み込まれてはいません。

main.rb

#!ruby
autoload(:Hoge, 'hoge')
p Hoge

p Hogeを実行した時点で、hoge.rbが読み込まれます。

つまり、参照されたタイミングで読み込みを行うように「予約」しておくのがautoload()なんですね。

それにたいして、require()は、require()が実行されたタイミングで読み込みが行われます。

全部読み込んで使いたい場合は、require()

使うものと使わないものが混在している場合は、autoload()

とすると、エコ(謎)ですね。

次に具体的な例をあげてみます。

module_a.rb

#!ruby
module ModA
  def hoge
    return "hoge"
  end
end

module_b.rb

#!ruby
module ModB
  def fuga
    return "fuga"
  end
end

require_case.rb

#!ruby
require 'module_a'
require 'module_b'
p ModA.hoge

autoload_case.rb

#!ruby
autoload(:ModA, 'module_a')
autoload(:ModB, 'module_b')
p ModA.hoge

ModA、ModBというモジュールをそれぞれmodule_a.rbとmodule_b.rbに定義しておいて

それらをrequireとautoloadそれぞれで読み込んで使ってみます。

このとき、require()の場合だとmodule_a.rbもmodule_b.rbも両方読み込んでいるので

どちらのモジュールも即座に使う事ができます。

そのかわり、require_case.rbでは実際に使わなかったmodule_b.rbも読み込んでしまいましたね。

これに対して、autoload()の場合だとautoload()を実行した段階ではまだmodule_a.rbも

module_b.rbも読み込まれてはいません。

ModAまたはModBを参照したタイミングで、module_a.rbやmodule_b.rbが読み込まれます。

使うときにはじめて読み込まれるために、require()よりは動作するまでに若干の間が生じます。

そのかわり、autoload_case.rbでは実際に使われたmodule_a.rbだけが読み込まれて

実際に使われなかったmodule_b.rbは読み込みませんでした。エコ(何)ですね。

最初に全部読み込んでしまうか、使うときにはじめて読み込むか。

ケースバイケースだとは思いますが、今まで全部require()でやってきた僕は

場合によってはautoload()を使った方がいいんじゃないかと思いました。

shingotadashingotada 2008/02/27 18:24 メモリの消費を抑えられるとか効果あるんでしょうか?

saronpasusaronpasu 2008/02/27 18:32 ruby -rprofile hoge.rb と実行してみると、実行時間計測できます。
上記のコードの場合はあまり差がないけど、require()やautoload()で読み込む対象のファイルに書かれているオブジェクトが多くなるほど、それに比例してrequire()で全部読んだ場合のコードが遅くなるんじゃないかと思っています。

yowayowa 2008/02/28 02:29 rejectの否定より、select(か別名のfind_all)の方が素直かも。

リンク元