Прочитать на английском

Поделиться через


Stopwatch Класс

Определение

Предоставляет набор методов и свойств, которые можно использовать для точного измерения затраченного времени.

public class Stopwatch
Наследование
Stopwatch

Примеры

В следующем примере показано, как использовать Stopwatch класс для определения времени выполнения приложения.

using System;
using System.Diagnostics;
using System.Threading;
class Program
{
    static void Main(string[] args)
    {
        Stopwatch stopWatch = new Stopwatch();
        stopWatch.Start();
        Thread.Sleep(10000);
        stopWatch.Stop();
        // Get the elapsed time as a TimeSpan value.
        TimeSpan ts = stopWatch.Elapsed;

        // Format and display the TimeSpan value.
        string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
            ts.Hours, ts.Minutes, ts.Seconds,
            ts.Milliseconds / 10);
        Console.WriteLine("RunTime " + elapsedTime);
    }
}

В следующем примере показано использование класса для Stopwatch вычисления данных о производительности.

using System;
using System.Diagnostics;

namespace StopWatchSample
{
    class OperationsTimer
    {
        public static void Main()
        {
            DisplayTimerProperties();

            Console.WriteLine();
            Console.WriteLine("Press the Enter key to begin:");
            Console.ReadLine();
            Console.WriteLine();

            TimeOperations();
        }

        public static void DisplayTimerProperties()
        {
            // Display the timer frequency and resolution.
            if (Stopwatch.IsHighResolution)
            {
                Console.WriteLine("Operations timed using the system's high-resolution performance counter.");
            }
            else
            {
                Console.WriteLine("Operations timed using the DateTime class.");
            }

            long frequency = Stopwatch.Frequency;
            Console.WriteLine("  Timer frequency in ticks per second = {0}",
                frequency);
            long nanosecPerTick = (1000L*1000L*1000L) / frequency;
            Console.WriteLine("  Timer is accurate within {0} nanoseconds",
                nanosecPerTick);
        }

        private static void TimeOperations()
        {
            long nanosecPerTick = (1000L*1000L*1000L) / Stopwatch.Frequency;
            const long numIterations = 10000;

            // Define the operation title names.
            String [] operationNames = {"Operation: Int32.Parse(\"0\")",
                                           "Operation: Int32.TryParse(\"0\")",
                                           "Operation: Int32.Parse(\"a\")",
                                           "Operation: Int32.TryParse(\"a\")"};

            // Time four different implementations for parsing
            // an integer from a string.

            for (int operation = 0; operation <= 3; operation++)
            {
                // Define variables for operation statistics.
                long numTicks = 0;
                long numRollovers = 0;
                long maxTicks = 0;
                long minTicks = Int64.MaxValue;
                int indexFastest = -1;
                int indexSlowest = -1;
                long milliSec = 0;

                Stopwatch time10kOperations = Stopwatch.StartNew();

                // Run the current operation 10001 times.
                // The first execution time will be tossed
                // out, since it can skew the average time.

                for (int i=0; i<=numIterations; i++)
                {
                    long ticksThisTime = 0;
                    int inputNum;
                    Stopwatch timePerParse;

                    switch (operation)
                    {
                        case 0:
                            // Parse a valid integer using
                            // a try-catch statement.

                            // Start a new stopwatch timer.
                            timePerParse = Stopwatch.StartNew();

                            try
                            {
                                inputNum = Int32.Parse("0");
                            }
                            catch (FormatException)
                            {
                                inputNum = 0;
                            }

                            // Stop the timer, and save the
                            // elapsed ticks for the operation.

                            timePerParse.Stop();
                            ticksThisTime = timePerParse.ElapsedTicks;
                            break;
                        case 1:
                            // Parse a valid integer using
                            // the TryParse statement.

                            // Start a new stopwatch timer.
                            timePerParse = Stopwatch.StartNew();

                            if (!Int32.TryParse("0", out inputNum))
                            {
                                inputNum = 0;
                            }

                            // Stop the timer, and save the
                            // elapsed ticks for the operation.
                            timePerParse.Stop();
                            ticksThisTime = timePerParse.ElapsedTicks;
                            break;
                        case 2:
                            // Parse an invalid value using
                            // a try-catch statement.

                            // Start a new stopwatch timer.
                            timePerParse = Stopwatch.StartNew();

                            try
                            {
                                inputNum = Int32.Parse("a");
                            }
                            catch (FormatException)
                            {
                                inputNum = 0;
                            }

                            // Stop the timer, and save the
                            // elapsed ticks for the operation.
                            timePerParse.Stop();
                            ticksThisTime = timePerParse.ElapsedTicks;
                            break;
                        case 3:
                            // Parse an invalid value using
                            // the TryParse statement.

                            // Start a new stopwatch timer.
                            timePerParse = Stopwatch.StartNew();

                            if (!Int32.TryParse("a", out inputNum))
                            {
                                inputNum = 0;
                            }

                            // Stop the timer, and save the
                            // elapsed ticks for the operation.
                            timePerParse.Stop();
                            ticksThisTime = timePerParse.ElapsedTicks;
                            break;

                        default:
                            break;
                    }

                    // Skip over the time for the first operation,
                    // just in case it caused a one-time
                    // performance hit.
                    if (i == 0)
                    {
                        time10kOperations.Reset();
                        time10kOperations.Start();
                    }
                    else
                    {

                        // Update operation statistics
                        // for iterations 1-10000.
                        if (maxTicks < ticksThisTime)
                        {
                            indexSlowest = i;
                            maxTicks = ticksThisTime;
                        }
                        if (minTicks > ticksThisTime)
                        {
                            indexFastest = i;
                            minTicks = ticksThisTime;
                        }
                        numTicks += ticksThisTime;
                        if (numTicks < ticksThisTime)
                        {
                            // Keep track of rollovers.
                            numRollovers ++;
                        }
                    }
                }

                // Display the statistics for 10000 iterations.

                time10kOperations.Stop();
                milliSec = time10kOperations.ElapsedMilliseconds;

                Console.WriteLine();
                Console.WriteLine("{0} Summary:", operationNames[operation]);
                Console.WriteLine("  Slowest time:  #{0}/{1} = {2} ticks",
                    indexSlowest, numIterations, maxTicks);
                Console.WriteLine("  Fastest time:  #{0}/{1} = {2} ticks",
                    indexFastest, numIterations, minTicks);
                Console.WriteLine("  Average time:  {0} ticks = {1} nanoseconds",
                    numTicks / numIterations,
                    (numTicks * nanosecPerTick) / numIterations );
                Console.WriteLine("  Total time looping through {0} operations: {1} milliseconds",
                    numIterations, milliSec);
            }
        }
     }
}

Комментарии

Экземпляр Stopwatch может измерять затраченное время для одного интервала или общее количество затраченного времени за несколько интервалов. В типичном Stopwatch сценарии вызывается Start метод , затем в конечном итоге вызывается Stop метод , а затем проверка затраченное время с помощью Elapsed свойства .

Экземпляр Stopwatch запущен или остановлен; используйте для IsRunning определения текущего Stopwatchсостояния . Используйте , Start чтобы начать измерение затраченного времени; используйте , Stop чтобы остановить измерение затраченного времени. Запрос значения затраченного времени с помощью свойств Elapsed, ElapsedMillisecondsили ElapsedTicks. Вы можете запросить свойства затраченного времени во время выполнения или остановки экземпляра. Свойства затраченного времени постоянно увеличиваются во время Stopwatch выполнения . Они остаются постоянными при остановке экземпляра.

По умолчанию значение затраченного времени экземпляра Stopwatch равно общему значению всех измеренных интервалов времени. Каждый вызов начинает Start подсчет в совокупное затраченное время; каждый вызов завершает Stop измерение текущего интервала и замораживает совокупное значение затраченного времени. Используйте метод для Reset очистки совокупного затраченного времени в существующем Stopwatch экземпляре.

Измеряет Stopwatch затраченное время путем подсчета тактов таймера в базовом механизме таймера. Если установленное оборудование и операционная система поддерживают счетчик производительности с высоким разрешением Stopwatch , класс использует этот счетчик для измерения затраченного времени. Stopwatch В противном случае класс использует системный таймер для измерения затраченного времени. Frequency Используйте поля и IsHighResolution для определения точности и разрешения Stopwatch реализации времени.

Класс Stopwatch помогает управлять счетчиками производительности, связанными с временем, в управляемом коде. В частности, Frequency поле и GetTimestamp метод можно использовать вместо неуправляемых API QueryPerformanceFrequency Windows и QueryPerformanceCounter.

Примечание

На многопроцессорном компьютере не имеет значения, на каком процессоре выполняется поток. Однако из-за ошибок в BIOS или на уровне аппаратной абстракции (HAL) можно получить разные результаты по времени на разных процессорах. Чтобы указать сходство процессоров для потока, используйте ProcessThread.ProcessorAffinity метод .

Конструкторы

Stopwatch()

Инициализирует новый экземпляр класса Stopwatch.

Поля

Frequency

Получает частоту таймера в виде количества тактов в секунду. Это поле доступно только для чтения.

IsHighResolution

Указывает, зависит ли таймер от счетчика производительности высокого разрешения. Это поле доступно только для чтения.

Свойства

Elapsed

Получает общее затраченное время, измеренное текущим экземпляром.

ElapsedMilliseconds

Получает общее затраченное время в миллисекундах, измеренное текущим экземпляром.

ElapsedTicks

Получает общее затраченное время в тактах таймера, измеренное текущим экземпляром.

IsRunning

Получает значение, указывающее, запущен ли таймер Stopwatch.

Методы

Equals(Object)

Определяет, равен ли указанный объект текущему объекту.

(Унаследовано от Object)
GetElapsedTime(Int64)

Возвращает время, прошедшее с момента startingTimestamp получения значения с помощью GetTimestamp().

GetElapsedTime(Int64, Int64)

Возвращает прошедшее время между двумя метками времени, извлеченными с помощью GetTimestamp().

GetHashCode()

Служит хэш-функцией по умолчанию.

(Унаследовано от Object)
GetTimestamp()

Получает текущее число тактов временного механизма.

GetType()

Возвращает объект Type для текущего экземпляра.

(Унаследовано от Object)
MemberwiseClone()

Создает неполную копию текущего объекта Object.

(Унаследовано от Object)
Reset()

Останавливает измерение интервала времени и обнуляет затраченное время.

Restart()

Останавливает измерение интервала времени, обнуляет затраченное время и начинает измерение затраченного времени.

Start()

Запускает или возобновляет измерение затраченного времени для интервала.

StartNew()

Инициализирует новый экземпляр Stopwatch, задает свойство затраченного времени равным нулю и запускает измерение затраченного времени.

Stop()

Останавливает измерение затраченного времени для интервала.

ToString()

Возвращает время в Elapsed виде строки.

ToString()

Возвращает строку, представляющую текущий объект.

(Унаследовано от Object)

Применяется к

См. также раздел