3

我将 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 调用。

4

1 回答 1

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)

对象:0.200000 0.000000 0.200000 (0.196342)

JSON:0.440000 0.000000 0.440000(0.444311)

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

于 2012-06-13T13:13:11.037 回答