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

И немного рекламы: сумка для ноутбука . Купить Чехол для Samsung GALAXY Tab. P7 Palmexx книга дешево, гарантия качества.

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

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

/// <summary>
/// Счетчик производительности
/// </summary>
class HightPerfomanceCounter
{
    [DllImport("kernel32.dll")]
    extern static short QueryPerformanceCounter(ref long x);
    [DllImport("kernel32.dll")]
    extern static  short QueryPerformanceFrequency(ref long x);

    long timeStart = 0, timeStop = 0;

    /// <summary>
    /// Время выполениния
    /// </summary>
    /// <returns></returns>
    public string Duration
    {
        get
        {
            long freq = 0;
            QueryPerformanceFrequency(ref freq);
            return ((timeStop - timeStart) * 1.0f / freq) + " сек";
        }
    }

    /// <summary>
    /// Старт таймера
    /// </summary>
    public void Start()
    {
        QueryPerformanceCounter(ref timeStart);
    }

    /// <summary>
    /// Стоп таймера
    /// </summary>
    public void Stop()
    {
        QueryPerformanceCounter(ref timeStop);
    }
}

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

HightPerfomanceCounter counter = new HightPerfomanceCounter();
string k = string.Empty;
counter.Start();
for (int i = 0; i < 40000; i++)
{
    k = k + i;
}
counter.Stop();
Console.WriteLine("Время работы 1-го теста составило {0}", counter.Duration);

StringBuilder sb = new StringBuilder();
counter.Start();
for (int i = 0; i < 40000; i++)
{
    sb.Append(i);
}
counter.Stop();
Console.WriteLine("Время работы 2-го теста составило {0}", counter.Duration);


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

Популярность: 11%

Теги: ,

Если у вас возникли вопросы, вы можете оставить их в комментариях

Оставить комментарий

(обязательно)

(обязательно)