2008-10-02 8 views
29

Je voudrais faire un profilage de base de mon code, mais j'ai trouvé que le DateTime.Now en C# avait seulement une résolution d'environ 16 ms. Il doit y avoir de meilleurs temps à garder des constructions que je n'ai pas encore trouvées.Minuteur haute résolution dans .NET

Répondre

48

est ici un peu d'exemple de code en temps une opération:

Dim sw As New Stopwatch() 
sw.Start() 
//Insert Code To Time 
sw.Stop() 
Dim ms As Long = sw.ElapsedMilliseconds 
Console.WriteLine("Total Seconds Elapsed: " & ms/1000) 

EDIT:

Et la chose intéressante est qu'il peut également reprendre.

Stopwatch sw = new Stopwatch(); 
foreach(MyStuff stuff in _listOfMyStuff) 
{ 
    sw.Start(); 
    stuff.DoCoolCalculation(); 
    sw.Stop(); 
} 
Console.WriteLine("Total calculation time: {0}", sw.Elapsed); 

La classe System.Diagnostics.Stopwatch utilisera un compteur haute résolution si l'on est disponible sur votre système.

18

La classe System.Diagnostics.StopWatch est géniale pour le profilage.

Voici un lien vers Vance Morrison's Code Timer Blog si vous ne voulez pas écrire vos propres fonctions de mesure.

+0

Eh oui, que l'on compte les tiques sur l'horloge haute résolution (le cas échéant) ... Exactement ce que je dois. –

1

Vous pouvez appeler le compteur de performance haute résolution sous Windows. Le nom de la fonction est QueryPerformanceCounter dans kernel32.dll.

Syntaxe pour l'importation en C#:

[DllImport("Kernel32.dll")] 
private static extern bool QueryPerformanceCounter(out long lpPerformanceCount); 

Syntaxe pour les appels de Windows:

BOOL QueryPerformanceCounter(  
    LARGE_INTEGER *lpPerformanceCount 
); 

QueryPerformanceCounter @ MSDN

6

Pour les compteurs de performance ayant la résolution la plus élevée, vous pouvez utiliser les compteurs de performance win32 sous-jacents.

Ajouter le P suivant/Invoke sigs:

[System.Runtime.InteropServices.DllImport("Kernel32.dll")] 
public static extern bool QueryPerformanceCounter(out long perfcount); 

[System.Runtime.InteropServices.DllImport("Kernel32.dll")] 
public static extern bool QueryPerformanceFrequency(out long freq); 

et les appeler à l'aide:

#region Query Performance Counter 
/// <summary> 
/// Gets the current 'Ticks' on the performance counter 
/// </summary> 
/// <returns>Long indicating the number of ticks on the performance counter</returns> 
public static long QueryPerformanceCounter() 
{ 
    long perfcount; 
    QueryPerformanceCounter(out perfcount); 
    return perfcount; 
} 
#endregion 

#region Query Performance Frequency 
/// <summary> 
/// Gets the number of performance counter ticks that occur every second 
/// </summary> 
/// <returns>The number of performance counter ticks that occur every second</returns> 
public static long QueryPerformanceFrequency() 
{ 
    long freq; 
    QueryPerformanceFrequency(out freq); 
    return freq; 
} 
#endregion 

Dump tout dans une classe simple et vous êtes prêt à aller. Exemple (en supposant un nom de classe de PerformanceCounters):

long startCount = PerformanceCounter.QueryPerformanceCounter(); 
// DoStuff(); 
long stopCount = PerformanceCounter.QueryPerformanceCounter(); 
long elapsedCount = stopCount - startCount; 
double elapsedSeconds = (double)elapsedCount/PerformanceCounter.QueryPerformanceFrequency(); 
MessageBox.Show(String.Format("Took {0} Seconds", Math.Round(elapsedSeconds, 6).ToString())); 
+9

La classe Stopwatch le fait pour vous à partir de .NET 2.0. –

Questions connexes