Announcement

Collapse
No announcement yet.

Methodenaufruf dauert beim ersten Mal sehr lange

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Methodenaufruf dauert beim ersten Mal sehr lange

    Hallo zusammen,

    ich habe in einer Anwendung 2 Methodenaufrufe die sehr lange dauern. Leider wurde da nicht so Modular programmiert (sind nicht von mir :-)).

    Ich schätze, dass es nicht an der Berechnung in der Methode liegt sondern eher daran, dass das .Net Framework die Methode erst einmal in den Hauptspeicher laden muss, kann das sein?

    Gibt es eine Möglichkeit den Aufruf zu beschleunigen, bzw. die methoden z.b. in einen Splashscreen so zu sagen schon einmal vor zu laden, so dass sie wenn sie benötigt wird nicht mehr so lange dauert?

    Grüße und Vielen Dank
    tomcat

  • #2
    Hallo,

    wie hast du festgestellt, dass die Methodenaufrufe so lange dauern? Ich glaube nicht, dass das JITen hier die Bremse ist, ggf. kann dies jedoch durch NGEN vermieden werden.

    mfG Gü
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      Ist evtl. eine DB oder ein größeres ActiveX-Control im Spiel?

      Comment


      • #4
        hallo,

        in dem ich es gesehen habe. es ist ein deutlicher unterschied zwischen dem ersten mal ausführen und dem zweiten mal.

        ein datenbank habe ich nicht. wird eine xml-datei gelesen, aber die wird jedes mal gelesen.

        grüße tomcat

        Comment


        • #5
          Dann musst du mal den Code analysieren. Ev. wird beim 2. Durchlauf auf zwischengespeicherte Daten zurückgegriffen, die Datei wurde gepuffert und muss nicht nochmal eingelesen werden o.a.
          Christian

          Comment


          • #6
            Hallo,

            eigentlich wird die xml-datei schon vorher eingelesen und auch auf daten innerhalb zugegriffen bevor diese methoden damit arbeiten.
            das interresante ist, dass ich das gefühl habe, dass es mit der länge der methode zu tun hat.

            die methode beginnt folgendermaßen.
            am anfang werden einige lisviews, textboxen usw. geleert und dann kommt eine abfrage ob eine zeile in einer listview selektiert ist

            if(listview.selecteditems.count != 0)
            {
            //hier kommen sehr viele zeilen code
            }
            else
            {
            //eine textbox wird hier geleert
            }

            d.h. beim ersten mal wird in den else zweig gegangen, also passiert eigentlich gar nichts. aber, scheinbar ließt das .net framework alle zeilen im if zweig ein.

            kann das sein?

            grüße tomcat

            Comment


            • #7
              Das wäre zu wünschen. Was sollte das Programm tun, wenn es in den if müsste. Wenn eine Klasse angelegt wird, wird sie komplett angelegt. Wer sollte entscheiden, wann welche Methoden gebraucht werden. Es ist glaube ich nicht zielführend, hier die Ursache beim Framework zu suchen. Vielmehr wird das wohl in der Programmierung liegen. Einen Unterschied hast du ja schon gefunden
              Christian

              Comment


              • #8
                hi christian,

                da hast du volkommen recht, dass es keinen sinn macht die ursache im framework zu suchen. das wollte ich damit auch nicht.

                für mich war die frage, ob sich das system wirklich so verhält wie ich denke und die methode im gesammten beim ersten ausführen in den speicher lädt und es deshalb zu dem unterschiedlichen verhalten kommt bzw. ausführungszeiten kommt.

                gibt es eine möglichkeit der anwendung zu sagen, dass sie eine bestimmte methode schon einmal laden soll, ohne sie auszuführen.

                Comment


                • #9
                  Hallo,

                  gibt es eine möglichkeit der anwendung zu sagen, dass sie eine bestimmte methode schon einmal laden soll, ohne sie auszuführen.
                  Nein, zumindest nicht direkt, aber mit NGEN (siehe oben) kann der IL-Code schon vor der Ausführung in Maschinencode übersetzt werden.
                  Möglich ist diese Methode bereits beim Start in einem anderen Thread laufen zu lassen, so dass quasi ein "Aufwärmen" stattfindet - exakter: dass diese bereits geJITet ist, wenn sie benötigt wird.

                  und die methode im gesammten beim ersten ausführen in den speicher lädt
                  Vereinfacht ausgedrückt: .net-Assemblies bestehen aus IL-Code. Beim Start der Anwendung lädt die CLR die Assembly(s) in den Speicher und der JITer übersetzt dann den IL-Code zu Maschinencode. Aber nur von jenen Methoden die auch benötigt werden, also lazy. Ist eine Methode schon einmal übersetzt worden, so wird die bereits übersetze verwendet.

                  Mir ist jedoch noch kein realer Fall untergekommen, indem das JITen zu einem Problem wurde. Daher ist - wie Christian auch schreibt - die Ursache wohl wonanders zu suchen. Hast du auch mit einem Profiler geschaut was abgeht?

                  mfG Gü
                  "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                  Comment

                  Working...
                  X