Eval()与表达式树

时间:2011-02-10 15:55:52

标签: ruby-on-rails ruby

我正在为客户设计调查系统,以便向中央办公室报告数据。在哪些情况下询问哪些问题是一个复杂的问题,需要在不更改代码的情况下进行自定义。我正在考虑以下几点:

模型

Question < ActiveRecord::Base
  attr_accessible :conditional_statement
  has_and_belongs_to_many :named_conditionals
end

NamedConditional < ActiveRecord::Base
  attr_accessible :name
  has_and_belongs_to_many :questions

  def evaluate
    # return true or false, depending on which conditional and the state of the system
  end
end

这里的想法是NamedConditional可以对系统状态进行测试,并返回一个布尔值。然后可以使用conditional_statement中的Question中的名称引用这些命名条件,使用许多NamedConditionals和逻辑运算符。然后,用于确定是否应该询问给定问题的流程将是这样的:

  1. 查找所有依赖NamedCondtionals
  2. 评估所有依赖NamedConditionals
  3. 使用每个NamedConditional的值来评估conditional_statement
  4. 中的Question

    我的问题是在第3步中,使用eval()对conditional_statement进行评估有多昂贵?我看到另一个选项是在保存conditional_statement时将Question解析为表达式树,将其存储在数据库中(序列化),然后在需要进行评估时对其进行反序列化。

    对于给定的请求,可能会发生许多(100+)个问题。显然,我可以缓存并重用每个NamedConditional的值(因为每个值都将用于多个问题)。在这种情况下,eval()的表现是否优于表达式树?或两种选择都是垃圾?

1 个答案:

答案 0 :(得分:0)

强烈的感觉是表达式序列化/反序列化将比仅仅避开一些条件需要更长的时间。

毕竟 - 条件以红宝石的速度评估 - 加上一个用于解释字符串的小常量。序列化/反序列化很慢 - 并且随着N的增加,它将至少在多项式上增加......可能更多。