Ankündigung

Einklappen
Keine Ankündigung bisher.

Verzögerung bei erstmaliger Rule-Ausführung

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Verzögerung bei erstmaliger Rule-Ausführung

    Hallo,

    mir ist aufgefallen, dass die erstmalige Ausführung einer Regel eine enorme Verzögerung aufweist. Auf meinem Raspberry Pi können das mehrere Sekunden sein. Ist das ein bekanntes Problem?

    Habe das Logging bereits abgedreht und warte mehrere Minuten nach dem Hochfahren bis ich zu testen beginne.

    Ich habe etwa 100 items und 20 rules.

    Vielleicht kann mir jemand einen Denkanstoß geben.

    #2
    Ja, das ist glaube ich so gedacht. Ich vermute, dass Xtend die Regel einmal übersetzt und dann beim nächsten Mal direkt den übersetzten Code verwendet.

    Schön wäre es natürlich, manuell einen Compilierungslauf anstoßen zu können, damit die Regel dann direkt mit normaler "Performance" läuft.

    Grüße
    Sasch

    Kommentar


      #3
      Nein, Xtend kompiliert nicht, sondern interpretiert.
      Ich tippe eher auf eine Überlastung des RaspPis, hier gibt es einige andere Threads, wo diverses auf dem RaspPi viel länger braucht, als es normalerweise der Fall sein sollte...

      Kommentar


        #4
        Zitat von kkreuzer Beitrag anzeigen
        Nein, Xtend kompiliert nicht, sondern interpretiert.
        Ich tippe eher auf eine Überlastung des RaspPis, hier gibt es einige andere Threads, wo diverses auf dem RaspPi viel länger braucht, als es normalerweise der Fall sein sollte...
        Das erklärt nicht, warum nur bei der erstmaligen Ausführung eine derartige Latenz auftritt. Bei derartiger Verzögerung müssen fast File-I/Os oder besonders rechenintensive Aufgaben involviert sein. Ich hätte intuitiv auch auf ein Übersetzen getippt. Wenn tatsächlich nur interpretiert wird, käme vielleicht noch eine Optimierung des JIT-Compilers infrage.

        Kommentar


          #5
          Besteht die Möglichkeit hier mit Compiler-Switches etwas zu erreichen? Z.B. etwaiges Lazy-Loading o.Ä. deaktivieren!?

          Kommentar


            #6
            Wie gesagt wird hier nichts kompiliert. Ich kann mir eigentlich nur vorstellen, dass der allererste Aufruf irgendeiner Regel (und nicht von jeder Regel) evtl. etwas länger braucht, weil noch alle notwendigen Bundles gestartet werden müssen. Ansonsten habe ich keine Erklärung für das Verhalten.

            Kommentar


              #7
              Bis beim Raspy die Regeln das erste Mal geladen sind (im Log abgearbeitet) vergehen etliche Minuten! Ich beobachte meist die ersten 15 Minuten das Log und dann benutze ich alles wie gewünscht. Dann gibt es auch keine spürbare Verzögerung bei der Regelanwendung.

              LG Tom

              Kommentar


                #8
                Danke für Eure Antworten. Ich warte ebenfalls bis alle Regelfiles geladen sind (dauert auch bei mir mehrere Minuten). Ich bemerke die Verzögerung bei der ersten Ausführung jeder einzelnen Regel (auch wenn bereits eine Regel aus demselben File ausgeführt wurde). Ich werde das nochmal etwas genauer untersuchen und bei Erfolg meine Weisheiten hier verbreiten

                Kommentar


                  #9
                  Jetzt habe ich einen konkreten Verdacht, was die Ursache für dieses Phänomen sein könnte:

                  Code:
                      public Injector createInjector() {
                          return Guice.createInjector(new org.openhab.model.rule.RulesRuntimeModule());
                      }
                  Hier wird keine "Stage" angegeben (Production/Development). Per Default wird hier laut https://issues.jboss.org/browse/REST...bpanel&_sscc=t "Development" verwendet, was offenbar für eine "Lazy-Injection" sorgt. Das könnte erklären, warum auf dem Raspy jeweils der erste Call einer Regel so lange dauert. Warum das nur bei mir so ist, ist mir jedoch ein Rätsel...

                  Was meint ihr?

                  Kommentar


                    #10
                    Das erklärt aber noch nicht, warum es bei jeder Regel erneut auftritt, oder? Der Injector sollte doch eigentlich nur einmalig bei der allerersten Regelnutzung erzeugt werden...

                    Kommentar


                      #11
                      Das kommt darauf an, wann der interpreter der ScriptImpl injected wird. Wenn das in Abhängigkeit der gegebenen Parameter passiert (zu meiner Schande muss ich gestehen, dass ich noch keine Ahnung von DI habe), dann würde es genau dieses Verhalten erklären.

                      Der interpreter ist mit einem Inject-Keyword versehen:

                      Code:
                      @Inject protected IExpressionInterpreter interpreter;
                      Der erste Call des interpreters innerhalb der ScriptImpl sieht so aus:

                      Code:
                      IEvaluationResult result = interpreter.evaluate(xExpression, evaluationContext, CancelIndicator.NullImpl);
                      Soll nur mal ein Denkanstoß sein, ich muss mich erst noch genauer in die DI-Thematik einarbeiten.

                      Kommentar

                      Lädt...
                      X