Таймер высокого разрешения в .NET - PullRequest
33 голосов
/ 02 октября 2008

Я хотел бы выполнить базовое профилирование моего кода, но обнаружил, что DateTime.Now в C # имеет разрешение всего около 16 мс. Должно быть, лучше хранить конструкции, которые я еще не нашел.

Ответы [ 4 ]

55 голосов
/ 02 октября 2008

Вот пример кода для определения времени операции:

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:

И самое интересное в том, что оно может возобновиться.

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

Класс System.Diagnostics.Stopwatch будет использовать счетчик высокого разрешения, если он доступен в вашей системе.

20 голосов
/ 02 октября 2008

Класс System.Diagnostics.StopWatch отлично подходит для профилирования.

Вот ссылка на Блог Таймера Кодов Вэнса Моррисона , если вы не хотите писать свои собственные функции измерения.

7 голосов
/ 02 октября 2008

Для счетчиков производительности с самым высоким разрешением вы можете использовать базовые счетчики производительности win32.

Добавьте следующие символы P / Invoke:

[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);

И позвоните им, используя:

#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

Сбросьте все это в простой класс, и вы готовы к работе. Пример (при условии, что имя класса 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()));
1 голос
/ 02 октября 2008

Вы можете вызвать счетчик производительности с высоким разрешением в Windows. Имя функции - QueryPerformanceCounter в kernel32.dll.

Синтаксис для импорта в C #:

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

Синтаксис для вызова Windows:

BOOL QueryPerformanceCounter(      
    LARGE_INTEGER *lpPerformanceCount
);

QueryPerformanceCounter @ MSDN

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...