2013-02-09 4 views
9

Ich habe versucht, eine JavaScript-Codierungsfunktion (in C#) zu optimieren, um die Leistung zu verbessern (in einem allgemeinen Versuch, die Leistung einer Enterprise-Webanwendung zu verbessern) . Wir haben versucht, .NET HttpUtility.JavaScriptStringEncode zu verwenden, aber es codiert nicht die Art und Weise, wie unsere Datenschicht vorwegnimmt (und das Ändern der Datenschicht ist nicht auf dem Tisch).Leistungsunterschied zwischen .NET-Methode (in .dll) und reflektierter Version

Mit dem RedGate Profiler Tool habe ich festgestellt, dass die beste Leistung unserer Funktion etwa 8% der gesamten Seitenauslastung ist. Wenn ich die .NET-Funktion (auf einer Seite, die es akzeptiert) verwenden, kommt es um etwa 0,08% der gesamten Seitenlast. Wir haben die .NET-Funktion reflektiert, um zu sehen, welche Zauberei sie gearbeitet haben, und als ich den reflektierten Code in die Funktion kopiert und direkt ausgeführt habe, hat sie bei etwa 10% funktioniert.

Ich bin neugierig, warum. Wie ist die .NET-Funktion anders vorbereitet, um eine solche Leistungssteigerung zu vergeben?

Ich entschuldige mich im Voraus, aber ich kann nicht die Funktion einfügen, die wir verwenden, aber ich denke nicht, dass dies Auswirkungen auf die Beantwortung der Frage auswirken sollte.

+1

Interessant. Stellen Sie nur sicher, aber Sie haben diese Benchmarks im Release-Modus auf demselben PC und derselben Seite ausgeführt, richtig? Oh, und haben Sie den Test mehrmals im selben Lauf ausgeführt, um sicherzustellen, dass der JIT den gesamten Code generiert hat, bevor Sie ihn getestet haben? – Cameron

+1

Hat sich die tatsächliche Laufzeit geändert oder nur der Bruchteil der gesamten Seitenauslastung? Vielleicht ist die Seite komplexer und die Summe ist langsamer. –

+0

Ich würde versuchen, den ServiceStack Serializer (verfügbar über NuGet) zu verwenden; Es ist schnell, aber immer noch relativ flexibel. Versuchen Sie bei Leistungsmessungen, den Code in einen Komponententest oder Ähnliches zu isolieren, damit Sie wiederholte Iterationen durchführen und verschiedene Ansätze vergleichen können. Benchmark-Code, der über IIS läuft, ist normalerweise nicht ideal, da so viele andere Faktoren die Ergebnisse verzerren können. Beachten Sie, dass die Auslieferung von DLLs mit .NET in der Regel vorkompiliert ist und daher zur Laufzeit nicht JIT'-basiert sein muss. –

Antwort

1

Können Sie den erzeugten IL-Code vergleichen, nachdem Sie den reflektierten Code mit dem in der .NET-Bibliothek vorhandenen IL-Code in Ihre Bibliothek eingefügt haben? Der Compilerschalter, der zum Kompilieren verwendet wird, kann solche Unterschiede verursachen.