C# Pre Compiling - Macht das Sinn?

  • C#

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von Bluespide.

    C# Pre Compiling - Macht das Sinn?

    Hallo Leute,

    kurze Frage:

    Ist es sinnvoll Klassen Pre-Compilen zulassen, damit das JIT nicht so lange braucht?

    Hier ein wenig Code damit Ihr sehen könnt was ich meine:

    C#-Quellcode

    1. void foo()
    2. {
    3. PreCompile(typeof(System.Windows.Forms.Form));
    4. }
    5. private void PreCompile(Type typeToHandle)
    6. {
    7. System.Reflection.MethodInfo[] infos =
    8. typeToHandle.GetMethods(System.Reflection.BindingFlags.NonPublic |
    9. System.Reflection.BindingFlags.Public |
    10. System.Reflection.BindingFlags.Instance |
    11. System.Reflection.BindingFlags.Static |
    12. System.Reflection.BindingFlags.DeclaredOnly);
    13. foreach (var info in infos) {
    14. RuntimeMethodHandle handle = info.MethodHandle;
    15. System.Runtime.CompilerServices.RuntimeHelpers.PrepareMethod(handle);
    16. }
    17. }
    Dafür gibt es NGen. Führe das am Ende einer Installation, oder eines Updates auf dem Rechner aus, und du hast ein natives Image.
    Vorteil: Kein Warmup deines Codes.
    Nachteil: Je nach größe der Anwendung (und der Libraries) und Leistung des Rechners kann der Vorgang einige Minuten in Anspruch nehmen.

    Generell:
    Durch NGen bekommst du ein natives Image, dass bei Erstausführung deines Codes zwar schneller ist, sobald jedoch der Code einmal durch den JIT durch ist, hast du keine Vorteile gegenüber einem nativen Image.
    Durch ngen gehen auch einige features in zusamenhang mit Reflection noch nicht oder nur experimentell. Man verliert erstmal einige Vorteile der JIT und ist sowieso was ganz anderes als das Method prepare. Denn das macht am Ende dasselbe wie der jitter und hält immer noch die IL informationen.
    Das Vorbereiten eines Typs oder von Methoden gibt nur dann Sinn, wenn die Zeit die der jitter zum erzeugen der einzelnen Methoden braucht für dich bei der ersten Verwendung der Methode zu lange ist und du das ganze deshalb lieber zu einem anderen Zeitpunkt machen möchtest. Sowas braucht man so ca. nie^^ Hilft aber natürlich bei Vorhersehbarkeit von Ausführzeit, weil man damit das ausführen der Methode beim ersten mal rausnimmt...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---