0

从数据库中我加载了大约 1000 行。

我有一个打印表格的课程。在视图中,我几乎为每一列定义了一些规则,例如:

<% table.rules :date_uzp, lambda { |row| l row.date_uzp if row.date_uzp.present? } %>
<% table.rules :another_column, lambda { |row| helper_method row } %>

最后,我只需调用 <%= table.print %>,它就会为 table 生成 html。

为什么我需要一个特殊的类来生成表格?表格在这个项目中是非常具体的,所以为了遵循 DRY 的原则,我有它的类..

但是有一个问题,如果我处理几乎所有的列并在它们上调用匿名函数,它会很慢。(匿名函数被调用了大约 10 000 次,我知道,这相当多,但不能这么慢) 页面加载大约 50 秒。

哪里有问题?你有什么建议?

4

1 回答 1

0

匿名函数在这里并不慢。肯定是函数的内容很慢。

我最喜欢的分析工具是ruby​​-profMiniProfiler和 puts-ing 内置的Benchmark.measure.

初步猜测是:

  • 以 O(n) 2次运行的昂贵操作,因为在操作表时很容易进入
  • 日期解析。我的经验是,一些日期解析函数很快,而另一些则可能很慢(注意到使用date_uzp; 不确定具体,只是指出它是一种可能性)。
  • 加载 1000 个对象,然后在每个对象上加载多个关联(尤其是 has-many)。加载这么多活动记录对象可能真的很慢,特别是如果它增加了堆大小/开始触发大量垃圾收集。

编辑

好的,另一个想法。Lambdas(以及 ruby​​ 中的所有块)创建闭包来维护它们的上下文。也许您使用 lambdas 的策略是防止大量对象被垃圾收集?不过,我不确定如何建议您重构代码。我知道如何在没有闭包的情况下创建 lambda 的唯一方法是这样的:

def foo
  lambda {|row| helper_method row}
end

但是必须有更好的方法来组织代码。

于 2012-11-11T22:16:30.187 回答