Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. "Steuere" und "Aktualisiere" Vermeiden?

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    "Steuere" und "Aktualisiere" Vermeiden?

    This topic has been deleted. Only users with topic management privileges can see it.
    • MartinP
      MartinP last edited by MartinP

      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:
      35195c1d-fa6a-405f-8ba5-cee602b9c024-grafik.png

      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.

      paul53 1 Reply Last reply Reply Quote 0
      • paul53
        paul53 @MartinP last edited by

        @martinp sagte: Folgendes ist nur ein Beispiel

        Schlechtes Beispiel, denn man macht es so:

        Blockly_temp.JPG

        MartinP 1 Reply Last reply Reply Quote 0
        • mickym
          mickym Most Active last edited by mickym

          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.

          1 Reply Last reply Reply Quote 0
          • MartinP
            MartinP @paul53 last edited by MartinP

            @mickym So sehe ich das auch - und wenn ein JIT-Compiler ins Spiel kommt, wird das Ganze durchaus noch unübersichtlicher, da wird der Compiler da ggfs. die Hilfsvariable wieder weg-optimieren 😉

            Eigentlich ging es mir um folgenden Blockly von @paul53 mit einer Hilfsvariable

            https://forum.iobroker.net/assets/uploads/files/1701798890478-blockly_temp.jpg

            paul53 mickym 2 Replies Last reply Reply Quote 0
            • paul53
              paul53 @MartinP last edited by paul53

              @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 1 Reply Last reply Reply Quote 1
              • mickym
                mickym Most Active @MartinP last edited by mickym

                @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.

                1 Reply Last reply Reply Quote 0
                • MartinP
                  MartinP @paul53 last edited by

                  @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?

                  https://www.baeldung.com/jvm-code-cache

                  paul53 1 Reply Last reply Reply Quote 0
                  • paul53
                    paul53 @MartinP last edited by paul53

                    @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.

                    MartinP 1 Reply Last reply Reply Quote 0
                    • MartinP
                      MartinP @paul53 last edited by MartinP

                      @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.

                      bf571c6a-bb46-412b-96fb-7108fc3c61a1-grafik.png

                      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);
                      });
                      
                      
                      MartinP 1 Reply Last reply Reply Quote 0
                      • MartinP
                        MartinP @MartinP last edited by

                        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...

                        1 Reply Last reply Reply Quote 0
                        • First post
                          Last post

                        Support us

                        ioBroker
                        Community Adapters
                        Donate

                        767
                        Online

                        31.7k
                        Users

                        79.8k
                        Topics

                        1.3m
                        Posts

                        3
                        10
                        387
                        Loading More Posts
                        • Oldest to Newest
                        • Newest to Oldest
                        • Most Votes
                        Reply
                        • Reply as topic
                        Log in to reply
                        Community
                        Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                        The ioBroker Community 2014-2023
                        logo