3

他のファイルがこの共有requireファイルに1つだけ持つことができるように、すべての一般的な依存関係を持つことができる1つのrubyファイルを持つことができるようにしたいです。requirefoo.rbとbar.rballrequires.rbがありますfoo.rbbar.rbrequire "allrequires.rb"の両方に行を入れたいのですが、すべての必要条件は必要ありません。bar.rb

requireそのファイルを実際に必要としない.rbファイルで使用するかどうかは重要ですか?パフォーマンスに影響を与える可能性はありますか?

私は現在ruby 1.8.7 (2010-08-16 patchlevel 302) [i386-mingw32]

アップデート

両方の.rbファイルですべてのrequiresを「共有」/使用することは最善のアイデアではないようです。それに対する解決策は何でしょうか?

今、条件でファイル名を使うことを考えることができます。

4

4 に答える 4

3

2 つの主要なパフォーマンス ペナルティがあります。

  1. requireそれ自体を行うのにかかる時間。Ruby 1.9.1 と Ruby 1.9.2 では、すべての s を実行するのにかかる時間はrequire、線形スケーラビリティーよりも悪くなりました。s の数を 2 倍にするとrequire、2 倍以上の時間がかかりました。長いです。
  2. ファイル内のコードの実行にかかった時間required. 次のようなコードがある場合、コードの実行にはかなりの時間がかかります。
class MyClass
  MY_CONSTANT = File.read("data.txt")
end
于 2012-05-15T23:27:14.917 に答える
0

私の最終的な解決策は次のとおりです(誰かが役に立つと思う場合):

requires.rb は、web.rb または testweb.rb、rufus.rb または testrufus.rb から呼び出されます。

called_from=caller[0].split(":")[0]


puts "loading web 'requires' for file: #{called_from} ..." if (["web"].any?{|s| called_from[s]})
puts "loading web 'requires' for file: #{called_from} ..." if (["rufus"].any?{|s| called_from[s]})
puts "loading web 'requires' for file: #{called_from} ..." if (["settings"].any?{|s| called_from[s]})

require 'rubygems'

require 'socket'        if (["web","settings"].any?{|s| called_from[s]})
require 'ruby-growl'    if (["web","settings","rufus"].any?{|s| called_from[s]})
require 'sinatra'       if (["web"].any?{|s| called_from[s]}) 

説明してくれた@Andrewと、これを解決する方法のヒントをくれた@peterに感謝します。

于 2012-05-23T00:28:41.437 に答える
0

はい、スピード違反があります。それが本当に重要かどうかを検討する方法をベンチマークできます。複数のrequireを使用して、画面スペースをあまり取らないように、このようにコードに裾を入れます。

['green_shoes','Hpricot'].each(&method(:require))

条件付きのrequireを行うこともできますが、コード全体が醜いでしょう

begin
  data = JSON.parse(text)
rescue
  require 'json_pure' 
  data = JSON.parse(text)
end

要するに、各rbに独自のrequireを与えます

于 2012-05-16T09:59:53.137 に答える