Точное измерение производительности в дотнете
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.04.03 22:02
Оценка: 179 (25)
#Имя: FAQ.dotnet.PerfCounter
Utils.PerfCounter — простенький классик для точного замера производительности в дотнете.

Измеряет значительно точнее чем Environment.TickCount. Environment.TickCount имеет точность ~ 10 милисекунд, что для измерения коротких участков неприемлимо. Использование QueryPerformanceCounter позволяет обеспечить очень высокую точность.

Использовать так:

// Где нибудь объявляем переменную...
PerfCounter timer = new PerfCounter();

timer.Start(); // Начало замера

// тестируемый код...

// Выводим результат в консоль.
Console.WriteLine("Время выполнения в секундах: {0:### ### ##0.0000}"
    timer.Finish());
// Одну переменную можно использовать многократно.


Код класса:
using System;
using System.Runtime.InteropServices;

namespace Utils
{
    /// <summary>
    /// Эта структура позволяет подсчитать скорость выполнения кода одним из
    /// наиболее точным способов. Фактически вычисления производятся в тактах
    /// процессора, а потом переводятся в милисекунд (десятичная часть 
    /// является долями секунды).
    /// </summary>
    public struct PerfCounter
    {
        Int64 _start;

        /// <summary>
        /// Начинает подсчет вермени выполнения.
        /// </summary>
        public void Start()
        {
            _start = 0;
            QueryPerformanceCounter(ref _start);
        }

        /// <summary>
        /// Завершает полсчет вермени исполнения и возвращает время в секундах.
        /// </summary>
        /// <returns>Время в секундах потраченое на выполнение участка
        /// кода. Десятичная часть отражает доли секунды.</returns>
        public float Finish()
        {
            Int64 finish = 0;
            QueryPerformanceCounter(ref finish);

            Int64 freq = 0;
            QueryPerformanceFrequency(ref freq);
            return (((float)(finish - _start) /(float)freq));
        }

        [DllImport("Kernel32.dll")]
        static extern bool QueryPerformanceCounter(ref Int64 performanceCount);

        [DllImport("Kernel32.dll")]
        static extern bool QueryPerformanceFrequency(ref Int64 frequency);
    }
}
... << RSDN@Home 1.0 beta 6a >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.