4

検索の保存に使用される「検索」という単純なモデルがあります。URL パラメータをキャプチャし、ハッシュとしてシリアル化された属性 :search_criteria に格納します。

serialize :search_criteria, Hash

これはすべて完全に機能しますが、パフォーマンスは恐ろしくなります。オブジェクトが 5 つだけの場合、次のステートメントは約 0.2 秒かかります。

start = Time.now
SavedSearch.all.map(&:search_criteria)
puts Time.now - start

ただし、serialize 行を削除すると (search_criteria が文字列を返すように)、ステートメントにかかる時間はわずか 0.002 秒です。これは、ハッシュを逆シリアル化するための 2 桁の違いです!!

ここで何が起こっているのですか?

Rails.version = 3.2.8 Ruby 1.9.3p194 (2012-04-20 リビジョン 35410) [x86_64-linux]

4

2 に答える 2

2

この問題は、YAML パーサーが原因で発生します。YAML のデシリアライズは非常に遅いです。YAML ではなく、JSON として search_criteria ハッシュをシリアル化することで、これを解決しました。現在では、およそ 100 倍高速になっています。

追加の読み物については、http://iprog.com/posting/2009/10/ruby-on-rails-performance-series-intro-yaml をご覧ください。

于 2012-11-09T14:41:20.667 に答える
2

Active Record はおそらく多くのオーバーヘッドを抱えているため、やり過ぎのように見えます。ループすると、SavedSearch 内のすべてのオブジェクトがインスタンス化され、作成する必要がある属性が評価され、マップが実行されます。

「search_criteria」に格納されていると思われる正確な構造がわかっている場合は、単純に YAML のテキスト属性に格納します。それはずっと速いはずです。

于 2012-11-08T16:29:56.943 に答える