27 votes

Haute résolution de la temporisation .NET

J'aimerais faire quelques notions de profilage de mon code, mais a constaté que le type DateTime.Maintenant en C# n'ont une résolution d'environ 16 mme. Il doit y avoir de meilleurs temps de maintien de constructions que je n'ai pas encore trouvé.

44voto

quickcel Points 467

Voici un exemple de code pour le temps d'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 reprendre ainsi.

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

Le Chronomètre de la classe va utiliser un compteur haute résolution si l'on est disponible sur votre système.

18voto

MagicKat Points 5192

Le Système.Diagnostics.Chronomètre de classe est génial pour le profilage.

Voici un lien vers Vance Morrison du Code de la Minuterie Blog si vous ne voulez pas écrire vos propres fonctions de mesure.

6voto

Wolfwyrd Points 7142

Pour la résolution la plus élevée des compteurs de performance, vous pouvez utiliser le sous-jacent win32 compteurs de performance.

Ajouter le suivant P/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 de 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

Jetez-le dans une classe simple et vous êtes prêt à aller. Exemple en supposant que le nom de classe 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()));

1voto

ChronoPositron Points 633

Vous pourriez appel à la haute résolution de compteur de performances dans Windows. Le nom de la fonction est QueryPerformanceCounter dans kernel32.dll.

La syntaxe pour l'importation en C#:

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

La syntaxe pour Windows composez le:

BOOL QueryPerformanceCounter(      
    LARGE_INTEGER *lpPerformanceCount
);

QueryPerformanceCounter @ MSDN

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X