Seltsames Leistungsverhalten

7

Ich verwende Visual Studio 2010 SP1, Zielframework ist 2.0, Plattformziel: Jede CPU, testet unter Windows 7 x64 SP1.

Ich habe ein merkwürdiges Verhalten.

Ohne eine app.config oder mit der folgenden app.config, lässt es mein Programm langsam laufen (Stoppuhr zeigt ~ 0.11 s)

%Vor%

Die folgende app.config macht mein Programm x5 mal schneller (Stoppuhr zeigt ~ 0,02 s)

%Vor%

Dies ist der Testprogrammcode:

%Vor%

Ich sitze stundenlang und kann nicht herausfinden, was hier passiert. Hast du eine Idee?

    
DxCK 25.09.2011, 08:26
quelle

3 Antworten

15

Es klingt, als hätten Sie gerade eine Situation gefunden, in der .NET 4 viel schneller ist. Standardmäßig wird Ihre App mit dem Framework ausgeführt, für das sie erstellt wurde. Wenn Sie erzwingen es, .NET 4 zu verwenden, ist es schneller. Das kann eine Verbesserung des JIT-Compilers sein, die zufällig Ihre Situation beeinflusst, oder es kann eine Verbesserung des Frameworks sein - aber es sollte nicht zu überraschend sein, dass einige Dinge in neueren Versionen schneller sind.

(Für das, was es wert ist, würde ich die Anzahl der Iterationen erhöhen, über die Sie sich befinden, wenn ich Sie wäre ... auf meiner Box unter .NET 4 ist jede Iteration nur 10 ms, was nicht wirklich toll ist Ich bevorzuge einen Benchmark für mindestens ein paar Sekunden.)

(Und wie Mitch kann ich bestätigen, dass ich den gleichen Effekt sehe.)

EDIT: Ich habe das ein wenig genauer untersucht und einen interessanten Effekt gesehen ... Ich nehme an, wir rufen haystack.IndexOf(needle, StringComparison.OrdinalIgnoreCase) :

an
  • Unter .NET 2 sind die Ergebnisse ungefähr gleich groß, aber die "Nadel" ist
  • Unter .NET 4:
    • Wenn needle größer ist als haystack (wie in Ihrem Beispiel), ist .NET 4 viel schneller als .NET 2
    • Wenn needle dieselbe Größe wie haystack hat, ist .NET 4 ein kleines Bit langsamer als .NET 2
    • Wenn needle kleiner als haystack ist, ist .NET 4 viel langsamer als .NET 2

(Dies führt zu einem Test, bei dem das erste Zeichen von needle niemals in haystack , btw. erscheint.)

    
Jon Skeet 25.09.2011, 08:29
quelle
4

Ich habe Ihren Benchmark nur mit ein paar Optimierungen (die mehr Iterationen und Mittelungen enthalten) durchgeführt und kann bestätigen, dass die .NET 4.0-Version in der Tat 4-5 mal schneller ist.

Also vermutlich IndexOf() wurde in .NET 4.0

optimiert     
Mitch Wheat 25.09.2011 08:34
quelle
3

OK, einige Benchmarks mit dem neuen VS11

%Vor%

Diese ersten Ergebnisse bestätigen Ihre Ergebnisse, die neueren Versionen sind schneller.

Es ist jedoch viel häufiger, nach einer kurzen Zeichenfolge in einer größeren Zeichenfolge zu suchen:

%Vor%

Und mit einem viel längeren Heuhaufen (~ 400 Zeichen)

%Vor%

Was bedeutet, dass die Dinge für das gebräuchlichste Nutzungsmuster schlechter werden ...

Alle Messungen in Release-Konfiguration und Kundenprofil, soweit verfügbar.
Ausgehend von VS 11 mit Strg + F5
Win 7H, Core i7 2620M

    
Henk Holterman 25.09.2011 09:40
quelle

Tags und Links