2012-06-11 106 views
3

我使用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延迟加载。

回答

1

所以,事实证明,回滚到以前版本的Mongoid修复了这个问题。我猜这是因为它引入了早期版本的Active Model或Active Support。

  • 蒙戈:1.4.0
  • Mongoid:2.3.5
  • 活动模型:3.1.6
  • 活动支持:3.1.6

这些都是新的基准测试结果:

查询:0.110000 0.010000 0.120000(0.243558)

To Object:0.200000 0.000000 0.200000(0.196342)

JSON:0.440000 0.000000 0.440000(0。444311)

如果我有机会深入代码,我会尝试返回并更新我找到的任何东西。

+0

请确定,我遇到了同样的问题,我无法找到任何与我的代码有关的错误,因为它的花园种类很多,几乎失去了理智。感谢分享 –