我将 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 中定义的范围。
编辑:我之前实际上并没有在第一个基准测试中运行查询,因为 Mongoid 延迟加载直到 as_json 调用。