3

私はSinatra(1.3.2)とMongoid(2.4.10)を使用しています。約350のmongoドキュメントをJSONに変換するのに非常に長い時間がかかることに気づいています。

最も時間がかかっているものを確認するために、いくつかのベンチマークラッパーを追加しました。

get '/games' do
  content_type :text
  obj = nil
  t1 = Benchmark.measure { @games = filtered_games.entries }
  t2 = Benchmark.measure { obj = @games.as_json }
  t3 = Benchmark.measure { obj.to_json }
  "Query: #{t1}\nTo Object: #{t2}\nJSON: #{t3}"
end

filtered_gamesは、URLで渡されたパラメーターを使用してMongoidクエリの結果を返すだけです)

これは典型的な応答です:

クエリ:0.100000 0.000000 0.100000(0.234351)

異議を申し立てる: 3.560000 0.010000 3.570000(3.569813)

JSON:0.220000 0.000000 0.220000(0.217941)

そのため、Mongoidオブジェクトを基本的なJSON構造(as_json)(3.5秒以上)に変換するだけで、その構造をJSON文字列に変換するのではなく、ほとんどの時間を費やしているように見えます。

ドキュメントはそれほど大きくありません(約450バイト、ドキュメントあたり15〜20フィールド)。

私を本当に混乱させているのは、Mongodbへの実際のクエリを実行し、応答を解析してMongoidオブジェクトに逆シリアル化するのにかかる時間がはるかに速いことだと思います。

どうしてこれなの?これをさらに最適化する方法について何か提案はありますか?Mongoへのネイティブ呼び出しを使用してそれらの結果を返すことができると思いますが、Mongoidで定義したスコープを引き続き使用できるようにしたいと思います。

編集:as_jsonが呼び出されるまで、Mongoidの遅延読み込みが原因で、以前は最初のベンチマークで実際にクエリを実行していませんでした。

4

1 に答える 1

1

そのため、Mongoid の以前のバージョンにロールバックすると、この問題が修正されました。これは、以前のバージョンの Active Model または Active Support を取り込むためだと推測しています。

  • モンゴ: 1.4.0
  • モンゴイド: 2.3.5
  • アクティブなモデル: 3.1.6
  • アクティブ サポート: 3.1.6

これらは新しいベンチマーク結果です:

クエリ: 0.110000 0.010000 0.120000 (0.243558)

オブジェクトへ: 0.200000 0.000000 0.200000 ( 0.196342)

JSON: 0.440000 0.000000 0.440000 (0.444311)

コードを掘り下げる機会があれば、戻ってきて、見つけたものを更新しようとします。

于 2012-06-13T13:13:11.037 に答える