4

我有一个名为“Search”的简单模型,用于存储搜索。它捕获 URL 参数并将它们存储在属性 :search_criteria 中,该属性被序列化为哈希:

serialize :search_criteria, Hash

这一切都很完美,但它的表现非常糟糕。仅对于 5 个对象,以下语句大约需要 0.2 秒。

start = Time.now
SavedSearch.all.map(&:search_criteria)
puts Time.now - start

但是,如果我删除了 serialize 行(这样 search_criteria 返回一个字符串),语句只需要 0.002 秒。这是反序列化哈希的 2 个数量级的差异!

这里发生了什么事?

Rails.version = 3.2.8 Ruby 1.9.3p194(2012-04-20 修订版 35410)[x86_64-linux]

4

2 回答 2

2

Active Record 可能会产生大量开销,因此看起来有点矫枉过正。当它循环时,它会在 SavedSearch 中实例化每个对象,然后评估它需要创建的属性,然后它会执行映射。

如果您知道确切的结构,它似乎存储在“search_criteria”中,那么只需将其存储在 YAML 中的文本属性中。那应该快很多。

于 2012-11-08T16:29:56.943 回答
2

该问题是由 YAML 解析器引起的。反序列化 YAML非常慢。我通过将 search_criteria 哈希序列化为 JSON 而不是 YAML 解决了这个问题。它现在快了大约 100 倍。

有关其他阅读材料,请查看http://iprog.com/posting/2009/10/ruby-on-rails-performance-series-intro-yaml

于 2012-11-09T14:41:20.667 回答