我有一个名为“搜索”的简单模型用于存储搜索。它捕获URL参数并将它们存储在属性中:search_criteria,序列化为哈希:
serialize :search_criteria, Hash
这一切都很完美,但它表现得非常糟糕。对于仅5个对象,以下语句大约需要0.2秒。
start = Time.now
SavedSearch.all.map(&:search_criteria)
puts Time.now - start
但是,如果我删除序列化行(使search_criteria返回一个字符串),则语句只需0.002秒。对于反序列化Hash,这是2个数量级的差异!
这里发生了什么?
Rails.version = 3.2.8 Ruby 1.9.3p194(2012-04-20修订版35410)[x86_64-linux]
答案 0 :(得分:2)
Active Record可能会产生大量开销,因此看起来有点过分。当它循环时,它实例化SavedSearch中的每个对象,然后评估它需要创建的属性,然后它就是地图。
如果你知道确切的结构,它似乎存储在'search_criteria'中,那么只需将它存储在文本属性的YAML中。这应该快得多。
答案 1 :(得分:2)
问题是由YAML解析器引起的。反序列化YAML 非常慢。我通过将search_criteria哈希序列化为JSON而不是YAML来解决这个问题。它现在变得快了100倍。
有关其他阅读材料,请查看http://iprog.com/posting/2009/10/ruby-on-rails-performance-series-intro-yaml