7

私たちは常にアプリケーションの設定を環境ファイルに入れていました。これは生産管理には適していないため、イニシャライザを介してロードします。

# myinitializer.rb
ApplicationConfig = YAML.load_file("#{Rails.root}/config/application/default.yml").symbolize_keys()

を介して構成にアクセスし始めるとすぐにApplicationConfig、アプリケーション テストのパフォーマンスが大幅に低下しました。1 つの rspec スイートが 4 秒から 30 秒に短縮されました。

before_filterアプリケーション コントローラーでは、次のように動作する を使用して何らかのアクションを実行する必要があります。

before_filter :extra_control

def extra_control
  if ApplicationConfig.some_flag
    ...
  end
end

を指す変数を宣言すると、ApplicationConfigパフォーマンスが完全に回復します。

config = ApplicationConfig

def extra_control
  if config.some_flag
    ...
  end
end

なんで?グローバル変数を介してこれにアクセスするとパフォーマンスが低下するのはなぜですか? これは、ビューやその他のコントローラーのコード ベース全体で行います。インスタンス変数をすべてのコントローラーに注入するなど、これを別の方法で行う必要がありますか?

編集: YAML から構成をロードするコードがいずれかの方法で 1 回だけ呼び出されることを確認したため、繰り返しのロードが根本的な原因ではないようです。

編集:これは、設定変数がブール値ではなく文字列としてロードされ、アプリケーションがテスト スリープ パターンに入ったために発生したバグであることが判明しました :( 申し訳ありませんが、試してくれてありがとう。私の人生の 3 日間もう戻らない!

4

4 に答える 4

0

ここでの他の回答は違いはありませんでした-これは無関係の問題が原因でした。記録のために

  • イニシャライザは rspec によって 1 回だけ呼び出されます
  • ApplicationConfig を使用するか APPLICATION_CONFIG を使用するかに違いはありません
  • 変数に代入しても速度に違いはありませんでした
于 2013-05-12T21:30:37.687 に答える
0

const を使用してみてください:

APPLICATIONCONFIG = YAML.load(File.read(File.expand_path("#{RAILS_ROOT}/config/application/default.yml", __FILE__)))

また

APPLICATIONCONFIG = YAML::load(File.open("#{RAILS_ROOT}/config/application/default.yml"))

ファイルをロードしても開いたり読み取ったりしないため、ファイルが遅くなると思います。

于 2013-05-08T07:53:35.537 に答える