私は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の遅延読み込みが原因で、以前は最初のベンチマークで実際にクエリを実行していませんでした。