Hauptmenü

Performance-Vergleich

Begonnen von Damian, 14 April 2018, 23:35:05

Vorheriges Thema - Nächstes Thema

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

choetzu

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
Raspi3, EnOcean, Zwave, Homematic

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF