2016-07-02 6 views
1

Gibt es einen Unterschied in der Art und Weise, wie geifert die neue Charge von Regeln überdenkt auslösen, wenn ich eine einzelne ändern Aussage gegen mehr Modify-Anweisungen habe, wie untengeifert Mehrere Ändern Statements vs. Einzel Ändern Statement

rule "Multiple Modify Statements" 
    dialect "mvel" 
    when 
     $m : Message(status == Message.HELLO) 
    then 
     modify ($m) { message = "Hope" }; 
     modify ($m) { status = Message.GOODBYE }; 
end 

rule "Single Modify Statements" 
    dialect "mvel" 
    when 
     $m : Message(status == Message.HELLO) 
    then 
     modify ($m) { message = "Never Give Up", 
         status = Message.GOODBYE }; 
end 
gezeigt

Und, gibt es irgendwelche Auswirkungen auf die Leistung.

Eigentlich versuchen wir, eine Excel-Entscheidungstabelle mit Aktionen für jede Spalte zu erstellen, daher sind mehrere Modify-Anweisungen vorzuziehen, da diese durch mehrere Spalten in der Excel-Datei repräsentiert werden können.

Alle Einsichten sehr geschätzt.

Antwort

2

Interessante Frage.

Die RHS der Regeln in Drools werden in Java-Klassen kompiliert. Wenn Sie einen Blick auf die generierten Klassen in Ihrem Beispiel nehmen, sehen Sie folgendes:

Bei der Verwendung von 2-Anweisungen ändert, wird der folgende Code generiert:

$m.setMessage("Hope"); 
update($m); 
$m.setStatus(Message.GOODBYE); 
update($m); 

Nun, wenn eine einzelne ändern Anweisung , sieht der generierte Code wie folgt aus:

$m.setMessage("Hope"); 
$m.setStatus(Message.GOODBYE); 
update($m); 

die Differenz die Anzahl der Male ist die Methode update aufgerufen wird. Diese Methode ist diejenige, die die Auswertung aller Bedingungen auslöst, die mit der Klasse Message zusammenhängen.

Ich würde annehmen, dass es eine Art Leistungsvorteil gibt, wenn Sie eine einzelne modify verwenden, aber ich kann Ihnen nicht versichern, wenn dieser Nutzen auffällt oder nicht. Ich denke, Ihre einzige Möglichkeit besteht darin, einen Benchmark-Test vorzubereiten, damit Sie den Leistungszuwachs (falls vorhanden) selbst messen können.

Hoffen, dass es hilft,

+0

Wenn die Probe Regel ist typisch, dann die Änderung des 'status' bewirkt eine Änderung im Netz des Motors von Mustern Auswertungen. + – laune

+0

@laune: Eigentlich wollen wir eine Entscheidungstabelle erstellen und haben viele Setter. Wir wollen jeden Setter als Aktion darstellen. Ich kann nicht sehen, wie ich das mit einer einzigen Modifikationsanweisung machen kann. Vielleicht können wir normale Setzer und eine Update-Anweisung in der letzten Spalte –

+0

haben. Das könnte auch Ihre Aktionsspalten vereinfachen. - Tipp: Fügen Sie die "letzte Spalte" zusammen, um die Aktion für alle Zeilen nach einem einzigen Eintrag auswählen zu können. – laune