【问题标题】:Very slow running as_json (Mongoid + Sinatra)as_json 运行速度非常慢(Mongoid + Sinatra)
【发布时间】:2012-06-11 19:27:04
【问题描述】:

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

【问题讨论】:

    标签: json performance mongodb sinatra 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)

    到对象:0.200000 0.000000 0.200000 (0.196342)

    JSON:0.440000 0.000000 0.440000 (0.444311)

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

    【讨论】:

    • 拜托,我遇到了完全相同的问题,我找不到我的代码有什么问题,因为它是如此多变,几乎失去了理智。感谢分享
    猜你喜欢
    • 2012-11-05
    • 2015-11-21
    • 1970-01-01
    • 2015-10-31
    • 1970-01-01
    • 2014-08-28
    • 2015-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多