NEWS
"Steuere" und "Aktualisiere" Vermeiden?
-
Ich habe hier schon mehrfach gehört, dass man "Steuere" und "Aktualisiere" Aufrufe im Blockly/Javascript Code minimieren solle, weil das die Scripte "aufblähen" würde...
Folgendes ist nur ein Beispiel ohne Funktion:
Ist da irgendetwas 'dran, dass die erste Variante ein größerer Ressourcenfresser ist, als die zweite?
Ist irgendwie für mich nicht nachvollziehbar.
Nachtrag Ich gehe natürlich davon aus, dass die beiden Blocklys die einzigen sind, die auf das "Steuere" Objekt zugreifen, sonst wäre die Situation nicht vergleichbar.
-
-
In letzter Konsequenz ist es vollkommen egal, welche der 3 Lösungen Du nimmst, der Datenpunkt wird in ALLEN Fällen nur 1x geschrieben. Eine Variable zu erstellen ist in jedem Fall überflüssig und „könnte“ man als Ressourcenfresser bezeichnen.
Und die Lösung von Paul funktioniert ja nur mit booleschen Werten, hat in sofern mit derFrage nur indirekt zu tun.
-
-
@martinp sagte: wenn ein JIT-Compiler ins Spiel kommt
Schon mal darüber nachgedacht, weshalb ioBroker einen so enormen RAM-Verbrauch bei gleichzeitig geringer CPU-Last hat?
Der JIT-Compiler (V8) von Node.js hat keinen Linker. Er kann deshalb keine Unterprogramme (Bibliotheken) einbinden. Funktionen werden bei ihrem Aufruf durch den deklarierten Inhalt ersetzt - und das bei jedem Aufruf. Das zieht sich bei komplexen Funktionen wie setState() bis zum js-controller durch.
@hobbyquaker hat sich bei der Einführung der Gruppe "global" im Javascript-Adapter etwas gedacht: Globale Skripte werden in jedes andere Skript kopiert und dort ausgeführt. Das macht nur Sinn mit global deklarierten Funktionen, die nur bei ihrem Aufruf übersetzt werden. -
@martinp Na in diesem Fall sind beide Variablen sinnvoll, da sonst mehrfach gelesen werden müsste, auch wenn nur einmal geschrieben wird.
Sonst müsstest Du in jeder Bedinung temperatur und switch abprüfen und damit jedes Mal den Datenpunkt (switch) erneut einlesen. Genauso wie temp (jedesmal erneut eingelesen würde), da ja über den Zeitplan getriggert wird.
Deshalb macht das in meinen Augen hier schon Sinn beides über Variablen zu regeln.
-
@paul53 said in "Steuere" und "Aktualisiere" Vermeiden?:
Funktionen werden bei ihrem Aufruf durch den deklarierten Inhalt ersetzt - und das bei jedem Aufruf. Das zieht sich bei komplexen Funktionen wie setState() bis zum js-controller durch.
Das heißt, dass der JIT bei jedem Auffinden eines Funktionsaufrufes einen neuen Eintrag mit der expandierten entsprechenden Funktion im Code-Cache anlegt?
-
-
@paul53 said in "Steuere" und "Aktualisiere" Vermeiden?:
@martinp sagte: Das heißt, dass der JIT bei jedem Auffinden eines Funktionsaufrufes einen neuen Eintrag mit der expandierten entsprechenden Funktion im Code-Cache anlegt?
Davon gehe ich aus, dass Funktionen keine Unterprogramme (Stichwort: Linker), sondern Makros sind, die eingefügt werden.
Wäre wirklich mal ein paar Experimente wert - bin das nicht gewohnt, so in Dunkeln zu tappen
Ich könnte mir ja schon vorstellen, dass der JIT-Cache so eine Art Inventar-Liste/Tabelle bereits gechacheter Funktionen bilden könnte, die das vermeiden könnte ... aber bin da wirklich ohne WIssen
EDIT: Das "Experimentieren" ist wirklich schwer, da Javascript ja Garbage Collective ist. Wenn ein Script gestoppt wird, ist der belegte Speicher nicht instantan frei, sondern irgendwann kommt der Garbage Collector vorbei, und räumt auf ...
Jedenfalls zuckt die Speichernutzung von "javascript.0" im Instanzen-Fenster nicht besonders stark, wenn man ein Script mit SetState() startet.
Nutze untenstehendes Script, um da ein "Zucken" bei der Speichernutzung zu provozieren...
Einmal kommentiere ich die erste Variante des async Calls aus, Einmal die zweite...
Kein messbarer Unterschied in der Speichernutzung ...
Für tiefere Diagnose müsste ich mich erst einlesen/* on({ id: [].concat(['0_userdata.0.Puls-Test']), change: 'ne' }, async (obj) => { let value = obj.state.val; let oldValue = obj.oldState.val; }); */ on({ id: [].concat(['0_userdata.0.Puls-Test']), change: 'ne' }, async (obj) => { let value = obj.state.val; let oldValue = obj.oldState.val; setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); setState('0_userdata.0.example_state' , true, true); setState('0_userdata.0.example_state' , false, true); });
-
Hier noch ein Link auf etwas Hintergrundinformation.
https://dev.to/_staticvoid/node-js-under-the-hood-10-compiler-optimizations-5dol
"In Line Expansion" scheint ein Sonderfall zu sein. Wäre die Frage, WARUM man das forcieren sollte. Der Regelfall scheinen wirklich Funktionsaufrufe mit Stack und allem Pipapo, wie in fast allen anderen Programmiersprachen auch zu sein...