Einfacher Methodenaufruf ist wirklich langsam?

8

Bearbeiten : Ich habe mein Problem gelöst. Die Ursache war ein Fehler in der Testprozedur und wird detailliert, sobald ich meine eigene Frage beantworten darf.

Ich weiß, dass diese Art von Frage generell vermieden werden sollte, aber ich bin auf eine wirklich seltsame Situation gestoßen, aus der ich keinen Sinn ziehen kann. Ich habe versucht, ein PRNG zu implementieren, und ich habe seine Leistung gegen System.Random getestet. Ich fand, dass mein Code ~ 50 mal langsamer war, aber es war nicht der Algorithmus, der das Problem war, sondern nur die Methode aufzurufen. Selbst wenn ich nur eine Konstante zurückgeben würde, wäre es immer noch viel langsamer.

Also schreibe ich ein einfaches Testprogramm, das den Aufruf einer Methode vergleicht, die random.NextDouble () umschließt, eine Methode, die -1 zurückgibt und random.NextDouble () direkt aufruft. Ich habe meinen Test in Ideone durchgeführt und hat die erwarteten Ergebnisse erzielt ; alle Zeiten waren ähnlich, und eine Konstante zurückzugeben war am schnellsten. Die Zeiten lagen alle bei 0,1 Sekunden.

Derselbe Code, der in Visual Studio 2011 Beta oder 2010 C # Express kompiliert wurde, würde jedoch jeweils 4 Sekunden, 4 Sekunden und 0,1 Sekunden ergeben. Ich bin definitiv im Freigabemodus, das Kontrollkästchen "Code optimieren" ist aktiviert, und das Starten von außerhalb von Visual Studio führt zu denselben Ergebnissen. Warum sind solche einfachen Methodenaufrufe in Visual Studio so viel langsamer als bei Ideone? Hier ist der Code, den ich verwendet habe:

%Vor%     
Kira Chow 08.04.2012, 19:32
quelle

1 Antwort

2

Sie sollten den ersten Aufruf von Random () und Random2 () nicht messen. Wenn eine Funktion zum ersten Mal aufgerufen wird, wird sie vom JITTER verarbeitet. Rufen Sie stattdessen Random () und Random2 () einmal auf und starten Sie dann die Messung. random.NextDouble () wurde bereits nach der Installation von .NET kompiliert, so dass es nicht unter dem gleichen Problem leidet.

Ich glaube nicht, dass dies den ganzen Unterschied erklärt, aber es sollte das Spielfeld ebnen.

    
zmbq 08.04.2012 20:04
quelle

Tags und Links