单独的Drools规则还是在结果中有更多?

时间:2012-12-14 04:30:23

标签: java performance drools rules

在编写drools规则时,我是否将检查分成更多规则或将它们全部归为一个规则,以便在“then”部分中包含更多ifs?不考虑任何管理问题,只考虑性能(例如执行时间,内存使用情况)。

假设我有多个任务,他们的条件和要做的事情是90%相似,只剩下10%是特定于每个任务。你写的是

吗?
rule A
when (90% conditions) and (task 1 or task 2 or task n)
then
    if (10% conditions for task 1) ...(10% stuff-to-do for task 1)
    else if (10% conditions for task 2) ...(10% stuff-to-do for task 2)
    else if (10% conditions for task n) ...(10% stuff-to-do for task n)
    (90% common stuff-to-do)
end

rule B-1
when (90% conditions) and (10% conditions for task 1)
then
    (90% common stuff-to-do) + (10% stuff-to-do for task 1)
end
rule B-2
when (90% conditions) and (10% conditions for task 2)
then
    (90% common stuff-to-do) + (10% stuff-to-do for task 2)
end
rule B-n
when (90% conditions) and (10% conditions for task n)
then
    (90% common stuff-to-do) + (10% stuff-to-do for task n)
end

谢谢!

3 个答案:

答案 0 :(得分:3)

我不是Rete引擎的专家,但一般规则是只要决策在规则的左侧,引擎就能够优化其Rete树以确保最大程度地做出决策有效率的。所以它应该更有效地保持LHS上的所有内容。与瘟疫一样,应该避免LHS中同样的“eval”原因。

当然,撇开微优化规则,如果在单独的规则中声明每个这样的决定,那么编写单元测试很简单,这些测试评估在不同情况下是否已激活正确的规则。如果你合并了这些规则,那么你就无法再测试你的规则是否会被触发。

答案 1 :(得分:2)

我更喜欢第二个。拥有单独的小规则很干净。 因为Drools的目的是将你的IF-ELSE改为RULES

答案 2 :(得分:1)

不是将条件和任务分组在一起,而是需要将它们分成单独的规则,如下例所示。由于RETE和内存使用主要取决于您的事实,而不是规则,因此执行时间无关紧要。

通过将条件逻辑分离为单独的规则,您将获得可测试且可管理的代码库。将所有内容放在一个大规则中与在普通java代码中使用if-else语句没有多大区别,在这种情况下,Drools只会增加项目的复杂性而没有任何好处。

rule 90_1
when
    //first rule for common stuff
then
    //
end


rule 90_2
when
    //second rule for common stuff
then
    //
end


rule 90_N
when
    //last rule for common stuff
then
    //
end

rule A_1
when
    //first rule for A
then
    //
end


rule A_2
when
    //second rule for a
then
    //
end

rule B
when
    //rule for B
then
    //
end