Es stellt sich immer wieder die Frage, wo lohnt es sich etwas zu beschleunigen, was dauert wie lange. Ich habe mir mal die Mühe gemacht einige einfache Definitionen bzgl. der Performance gegenüberzustellen. Mein System läuft auf einem i3-Prozessor, die Ergebnisse bzgl. der Rechenzeit dürften auf einem Raspi um einiges höher sein. Ausgewertet habe ich die verbrauchte Rechenzeit mit apptime.
Dazu habe ich ein DOIF definiert, welches im Sekundentakt durch Setzen des eigenen Status einen Trigger erzeugt:
defmod di_trigger DOIF ([+1])
attr di_trigger do always
Auf diesen Trigger reagieren verschiedene Module, die einfach den Dummy bla auf on setzen:
defmod di_test6 DOIF ([di_trigger])(set bla on)
attr di_test6 do always
defmod di_test7 DOIF {if ([di_trigger]) {fhem"set bla on"}}
defmod di_test8 DOIF {if ([di_trigger]) {CommandSet(undef,"bla on")}}
Die Ergebnisse sehen nach 5 Minuten Laufzeit wie folgt aus:
name function max count total average maxDly avgDly TS Max call param Max call
di_test6 DOIF_Notify 26 2992 3879.97 1.30 0.00 0.00 14.04. 23:16:21 HASH(di_test6); HASH(di_trigger)
di_test7 DOIF_Notify 12 2992 1894.32 0.63 0.00 0.00 14.04. 23:14:32 HASH(di_test7); HASH(di_trigger)
di_test8 DOIF_Notify 8 2992 1531.24 0.51 0.00 0.00 14.04. 23:14:34 HASH(di_test8); HASH(di_trigger)
Dagegen eine Definition ohne Setzen des Dummys:
defmod test_6 DOIF ([di_trigger])
attr test_6 do always
und eine, die aufgrund der Definition nur auf einen Trigger wartet, aber nie zum Zuge kommt, weil der Trigger nicht kommt:
defmod di_test9 DOIF ([BlaBlaBla])(set bla on)
name function max count total average maxDly avgDly TS Max call param Max call
test_6 DOIF_Notify 7 2992 1245.48 0.42 0.00 0.00 14.04. 23:16:59 HASH(test_6); HASH(di_trigger)
di_test9 DOIF_Notify 0 2992 76.31 0.03 0.00 0.00 14.04. 23:16:57 HASH(di_test9); HASH(di_trigger)
Die Module wurden insgesamt 2992 mal von FHEM getriggert, dabei hatten die Module 5 x 60=300 mal etwas zu tun.
Unter total bzw. average kann man sehen, wie viel Rechenzeit das jeweilige Modul in der beobachteten Zeit von 5 Minuten im produktiven System verbraucht hatte. Unter max kann man sehen wie lange das Modul braucht, wenn tatsächlich auch ein set-Befehl ausgeführt wurde bzw. entsprechende Readings und Status gesetzt wurden. Allerdings muss man dazu sagen, dass die Definitionen di_test7 und di_test8 im Perl-Modus keinen Status und weniger eigene Readings setzen.
Hmm, und was ist die Quintessenz? Wenn ich das als Laie richtig verstehe, hat test8 die geringste Leistung beansprucht. Heisst das nun, man sollte die CommandSet Befehle nutzen? Sorry, evtl. Ne dumme Frage...:)
Lg c
Zitat von: choetzu am 22 April 2018, 22:44:04
Hmm, und was ist die Quintessenz? Wenn ich das als Laie richtig verstehe, hat test8 die geringste Leistung beansprucht. Heisst das nun, man sollte die CommandSet Befehle nutzen? Sorry, evtl. Ne dumme Frage...:)
Lg c
Das habe ich bewusst wertfrei gelassen. Das muss jeder für sich beurteilen. Man könnte auf der einen Seite feststellen, dass DOIF-Perl drei mal so schnell sein kann, wie die gleiche Lösung mit DOIF-FHEM, auf der anderen Seite werden mehr Informationen beim DOIF-FHEM in Readings für den User bereitgestellt. Wir reden hier von Millisekunden. Bei dem Test habe ich das System im Sekundentakt gestresst. Wenn ein DOIF paar mal am Tag etwas schaltet, dann ist es ziemlich egal, ob die Sache 26 Millisekunden oder 8 Millisekunden dauert. Die Systemlast eines wachenden DOIFs ist mit 0,03 Millisekunden pro Event aus meiner Sicht gering.