• Программинг

Нужны источники бесперебойного питания?

Источники бесперебойного питания от дизельстор

Тест производительности кода C#

QueryPerformanceCounter – функция WinApi возвращающая значение высокоточного счетчика производительности. Такой инструмент полезен для тестирования производительности системы или ее отдельных элементов. Я написал класс, который основан на работе этой функции. Этот класс можно использовать для тестирования скорости работы кода ваших приложений с точностью до нескольких миллисекунд. Актуально при тесте кода, который выполняется меньше чем за секунду.

В следующем классе используются функции QueryPerformanceCounter и QueryPerformanceFrequency. Класс содержит два метода Start и Stop, а также свойство Duration, которое возвращает время работы в секундах.
Код класса:

1 /// <summary>
2 /// Счетчик производительности
3 /// </summary>
4 class HightPerfomanceCounter
5 {
6     [DllImport("kernel32.dll")]
7     extern static short QueryPerformanceCounter(ref long x);
8     [DllImport("kernel32.dll")]
9     extern static  short QueryPerformanceFrequency(ref long x);
10  
11     long timeStart = 0, timeStop = 0;
12  
13     /// <summary>
14     /// Время выполениния
15     /// </summary>
16     /// <returns></returns>
17     public string Duration
18     {
19         get
20         {
21             long freq = 0;
22             QueryPerformanceFrequency(ref freq);
23             return ((timeStop - timeStart) * 1.0f / freq) + " сек";
24         }
25     }
26  
27     /// <summary>
28     /// Старт таймера
29     /// </summary>
30     public void Start()
31     {
32         QueryPerformanceCounter(ref timeStart);
33     }
34  
35     /// <summary>
36     /// Стоп таймера
37     /// </summary>
38     public void Stop()
39     {
40         QueryPerformanceCounter(ref timeStop);
41     }
42 }

И пример использования:

1 HightPerfomanceCounter counter = new HightPerfomanceCounter();
2 string k = string.Empty;
3 counter.Start();
4 for (int i = 0; i < 40000; i++)
5 {
6     k = k + i;
7 }
8 counter.Stop();
9 Console.WriteLine("Время работы 1-го теста составило {0}", counter.Duration);
10  
11 StringBuilder sb = new StringBuilder();
12 counter.Start();
13 for (int i = 0; i < 40000; i++)
14 {
15     sb.Append(i);
16 }
17 counter.Stop();
18 Console.WriteLine("Время работы 2-го теста составило {0}", counter.Duration);

езультаты теста показали, что второй тест цикла работает в несколько десятков раз быстрее, хотя выполняют они одну и ту же функцию.