我正在使用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 只使用在网址中传递的参数返回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延迟加载。
答案 0 :(得分:1)
因此,事实证明,回滚到以前版本的Mongoid修复了这个问题。我猜这是因为它引入了早期版本的Active Model或Active Support。
这些是新的基准测试结果:
查询: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)
如果我有机会深入研究代码,我会尝试回来并更新我发现的任何内容。