Hallo Rudi,
In meinem perl - Code kommen in der gleichen sub häufig "readingsBulkUpdate($hash..." und ReadingsVal($name..." (bzw. andere "Readings..($name...") Funktionsaufrufe vor.
Für jeder der Funktionen muss erneut der $name über die $defs$name] in den zugehörigen hash in der fhem.pl "nachgeschlagen" werden, was ja eigentlich auch etwas unnötig Rechenleistung kostet, da der hash ja sowieso bekannt ist.
Könnte man in den subs "Reading..($name..." in der fhem.pl nicht auch den hash zulassen?
if(ref($d ne 'HASH')
{
return$default) if(!defined($defs{$d}));
}
else
{
$d = $defs{$d};
}
my $hash = $d;
...
Wenn man sich dann den orginalen Code ansieht, sieht man dass ziemlich häufig immer wieder $defs{$d} ausgewertet werden muss (Beispiel):
if(defined($defs{$d}) &&
defined($defs{$d}{OLDREADINGS}) &&
defined($defs{$d}{OLDREADINGS}{$n}) &&
defined($defs{$d}{OLDREADINGS}{$n}{VAL})) {
return $defs{$d}{OLDREADINGS}{$n}{VAL};
}
return $default;
}
Wäre mein Verbesserungsvorschlag.
Elektrolurch
Bei $defs{$d} muss nichts extra ausgewertet werden, das ist schlichtweg eine Variable, genau wie $name auch.
Da muss ich leider widersprechen:
$defs{$d} ist ein perl - Hash, der von perl zuerst ausgerechnet werden muss, d.h. in einer Tabelle (hashes) nachgeschlagen werden muss.
Bei beispielsweise 300 Objekten in %defs werden zwar nicht 300 Namens-vergleiche ausgeführt, dass Suchen in "Hash-Werten" funktioniert da schon etwas effizienter.
Trotzdem muss ja nicht der gleiche Ausdruck (unnötiger Weise) -zig mal erneut berechnet werden, dass lernt(e) man ja früher schon im Grundstudium.
Die Frage war ja: Warum ReadingsVal mit $name und readingsBulkUpdate mit $hash aufgerufen werden.
Ich fände es für die Readings... - Funktionen einfach auch sinnvoll, dass die auch zusätzlich mit $hash aufgerufen werden können.
Die Vermeidung zusätzlicher Rechenoperationen ist ein Abfallprodukt davon (sihe auch die Diskussion über notifyDev im hash zur Optimierung der Event-Verarbeitung.
Elektrolurch
Zitat von: Elektrolurch am 27 Juni 2022, 15:25:52
Die Frage war ja: Warum ReadingsVal mit $name und readingsBulkUpdate mit $hash aufgerufen werden.
ReadingsVal() ist für die Anwendung durch FHEM-Benutzer gedacht. Der Benutzer kennt normalerweise den Namen des betreffenden devices und muss sich deshalb nicht um den device-hash kümmern.
Die readings...Update Funktionen sind für die FHEM Entwicklung zur Benutzung in ihren Modulen vorgesehen. Dort wird in aller Regel ohnehin auf hash-Ebene gearbeitet.
[Zitat]
Die readings...Update Funktionen sind für die FHEM Entwicklung zur Benutzung in ihren Modulen vorgesehen. Dort wird in aller Regel ohnehin auf hash-Ebene gearbeitet.
[/Zitat]
Genau das ist es, was mich wundert: In den Modulen arbeite ich mit hash, aber es gibt keine ReadingsVal, die einen hash akzeptiert. Ein unnötiger Umweg, wie ich ja bereits oben beschrieben habe.
Elektrolurch
Hallo Rudi,
als "Erfinder" der fhem.pl: Wie siehst Du meinen Erweiterungsvorschlag?
Die Diskussion mit Betateilchen war diesbezüglich nicht zielführend.
Elektrolurch
Rudi wird hier nicht antworten - er liest nicht im Anfängerboard.