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é.
Réponses
Trop de publicités?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.
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.
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()));
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
);