Performance Tests



  • Hi,

    ich bin grad dabei die Performance von XmlDocument und XmlReader in ein paar bestimmten Fällen zu vergleichen. Und ich habe schon öfters gelesen und kann ich auch bestätigen, dass folgende Methode nicht sehr zuverlässig ist:

    DateTime start, end;
    GC.Collect();
    
    start = DateTime.Now;
    
    // Mach was.
    
    end = DateTime.Now;
    
    Console.WriteLine("Dauer: {0}", end - start);
    

    Hat vielleicht jemand ne Idee wie man etwas präziser die Performance in c#/.net messen kann?

    Gruß
    schrankwand



  • Wenn du .NET 2.0 verwendest, kannst du dort die Klasse System.Diagnostics.Stopwatch benutzen.

    Es gibt auch noch die Klasse PerformanceCounter (auch unter .NET 1.1), aber diese ist schwieriger zu verwenden.

    P.S: Die Genauigkeit von Date.Now liegt unter NT-Systemen (NT, Win2K, WinXP) bei ca. 10 Millisekunden.



  • Danke. System.Diagnostics.Stopwatch funktioniert super. Nur wie du bereits erwähnt hast, nur unter .net 2.0, daher auch nicht unter mono. Und bei System.Diagnostics.PerformanceCounter bekomm ich immer die Exception:

    Unhandled Exception: System.InvalidOperationException: Category does not exist.
       at System.Diagnostics.PerformanceCounterLib.CounterExists(String machine, String category, String counter)
       at System.Diagnostics.PerformanceCounter.Initialize()
       at System.Diagnostics.PerformanceCounter..ctor(String categoryName, String counterName, String instanceName, Boolean readOnly)
       at System.Diagnostics.PerformanceCounter..ctor(String categoryName, String counterName)
       at ConsoleApplication2.Program.Main(String[] args) in C:\Documents and Settings\User\My Documents\Visual Studio 2005\Projects\ConsoleApplication2\ConsoleApplication2\Program.cs:line 39
    
    PerformanceCounter pc = new PerformanceCounter("Prozessor", "Prozessorzeit (%)");
    float start, end;
    
    GC.Collect();
    
    start = pc.NextValue();
    
    // Mach was.
    
    end = pc.NextValue();
    
    pc.Dispose();
    
    Console.WriteLine("Dauer: {0}", end - start);
    


  • Hi,

    in der WinAPI gibt es noch die Funktion 'QueryPerformanceCounter' welche einen hochauflösenden Performance-Counter verwendet, jedoch weiß ich nicht genau wie man diesen nach C# (.NET) wrappt (wegen dem Parameter LARGE_INTEGER *).

    Ansonsten müsstest du einfach deine Testroutinen mehrere 100 Mal oder mehr aufrufen und dann mittels Date.Now die Zeit dann vergleichen.



  • Das sollte kein Problem sein LARGE_INTEGER ist einfach nur eine 64 Bit große union, die u.A als LONGLONG ausgelesen werden und "long long" bzw. "LONGLONG" ist in .net ein System.Int64.

    Aber da mein einzigstes Problem mit System.Diagnostics.Stopwatch ist, dass es nicht unter mono läuft, helfen mir WIN-API-Aufrufe auch nicht weiter, da solang ich unter Windows bin, ich problemlos das ms.net-Framework verwenden kann.



  • Ich bin rein zufällig auf einen Quellcode gestoßen, wo QueryPerformanceCounter in c# gewrapt wird (siehe unten).

    [DllImport("kernel32.dll", SetLastError=true)]
    private extern static int QueryPerformanceCounter(
    	ref long lpPerformanceCount);
    

Anmelden zum Antworten