非常慢的运行as_json(Mongoid + Sinatra)

时间:2012-06-11 19:27:04

标签: json performance mongodb sinatra mongoid

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

1 个答案:

答案 0 :(得分:1)

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

  • Mongo:1.4.0
  • Mongoid:2.3.5
  • 活动模型:3.1.6
  • 有效支持:3.1.6

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

  

查询: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)

如果我有机会深入研究代码,我会尝试回来并更新我发现的任何内容。