Question

J'aimerais faire un profilage de base de mon code, mais j'ai constaté que la résolution de DateTime.Now en C # n'avait qu'une résolution d'environ 16 ms. Il doit y avoir de meilleures structures de chronométrage que je n'ai pas encore trouvées.

Était-ce utile?

La solution

Voici un exemple de code permettant de chronométrer 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 aussi bien 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 utilisez un compteur haute résolution s'il en existe un sur votre système.

Autres conseils

La classe System.Diagnostics.StopWatch est excellente pour le profilage.

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

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

Ajoutez les sigs P / Invoke suivants:

[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 appelez-les en utilisant:

#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

Déposez le tout dans une classe simple et vous êtes prêt à commencer. 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()));

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

Syntaxe d'importation dans C #:

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

Syntaxe pour l'appel Windows:

BOOL QueryPerformanceCounter(      
    LARGE_INTEGER *lpPerformanceCount
);

QueryPerformanceCounter @ MSDN

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top