我使用Sinatra(1.3.2)和Mongoid(2.4.10)。我注意到将大约350个mongo文档转换为JSON需要很长时间。非常缓慢的运行as_json(Mongoid + Sinatra)
我增加了一些基准的包装只是为了看看什么是最耗时:
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查询使用的URL传递的参数结果)
这是一个典型的反应:
查询: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延迟加载。
请确定,我遇到了同样的问题,我无法找到任何与我的代码有关的错误,因为它的花园种类很多,几乎失去了理智。感谢分享 –