Как узнать время выполнения программы c visual studio
System. Diagnostics
Простой пример использования Stopwatch
Для начала, рассмотрим простой пример использования класса Stopwatch для измерения затраченного времени на выполнение операции.
- Создать объект класса Stopwatch ;
- Выполнить метод Start() для того, чтобы засечь время начала операции;
- Выполнить метод Stop() для того, чтобы засечь время окончания операции;
- Воспользоваться одним из свойств объекта для получения данных о затраченном на выполнение операции времени.
В примере использовано свойство ElapsedMilliseconds , которое позволяет получить количество миллисекунд, затраченных на выполнение операции. Рассмотрим какие ещё есть свойства и методы у класса Stopwatch .
Stopwatch
Свойства Stopwatch
Elapsed
Свойство Elapsed позволяет получить общее затраченное время, измеренное текущим экземпляром класса Stopwatch . Описание свойства выглядит следующим образом:
Свойство возвращает объект типа TimeSpan — интервал времени, используя который, можно получить время выполнения операции в удобном для вас виде. Например,
ElapsedMilliseconds
Свойство ElapsedMilliseconds позволяет получить общее затраченное время, измеренное текущим экземпляром класса Stopwatch в миллисекундах. В примере использования класса Stopwatch выше продемонстрировано использование этого свойства.
Elapsed Ticks
Свойство Elapsed Ticks позволяет получить общее время выполнение операции в тактах таймера, измеренное текущим экземпляром Stopwatch . Такт — это наименьшая единица времени, которую Stopwatch может измерять таймер. В следующем примере показано использование свойства Elapsed Ticks для измерения времени, затраченного на преобразование строки в целое число типа int .
Результатом выполнения этого кода может быть вот такой вывод консоли:
Is Running
Свойство IsRunning позволяет получить значение типа bool , указывающее на то запущен ли в данный момент таймер Stopwatch .
Поля Stopwatch
Класс Stopwatch содержит два статических поля, позволяющих получить сведения о настройках таймера.
Frequency
Поле Frequency содержит частоту таймера в виде количества тактов в секунду.
Это поле удобно использовать вместе со свойством Elapsed Ticks для преобразования количества тактов в секунды. Например,
Is High Resolution
Свойство Is High Resolution указывает, зависит ли таймер Stopwatch от счетчика производительности высокого разрешения ( true ) или же использует класс DateTime ( false ).
Пример использования поля
Вывод консоли будет иметь следующий вид:
Операции рассчитываются с использованием системного счетчика производительности с высоким разрешением.
Частота таймера = 10000000
Таймер работает с точностью до 100 наносекунд
Методы Stopwatch
Start и Stop
Метод Start() запускает или возобновляет работу таймера Stopwatch . В свою очередь, Stop() выполняет противоположную операцию — останавливает работу таймера. Использование этих методов продемонстрировано в самом первом примере из этой статьи.
Start New
Метод Start New() выполняет сразу несколько операций — он инициализирует новый экземпляр класса Stopwatch , обнуляет счётчик затраченного времени и запускает таймер. То есть, этот метод позволяет немного сократить исходный код программы. Например, код из первого примера можно было бы записать вот так:
Reset
Restart
Метод Restart() останавливает измерение интервала времени, обнуляет затраченное время и повторно запускает таймер. Таким образом, предыдущий пример можно переписать следующим образом:
Итого
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Предоставляет набор методов и свойств, которые можно использовать для точного измерения затраченного времени.
Примеры
В следующем примере показано, как использовать Stopwatch класс для определения времени выполнения приложения.
В следующем примере показано использование Stopwatch класса для вычисления данных о производительности.
Комментарии
Stopwatch Экземпляр может измерять затраченное время на один интервал или общее время, прошедшее через несколько интервалов. В типичном Stopwatch сценарии вы вызываете Start метод, а затем в конечном итоге вызываете Stop метод, а затем проверяете прошедшее время с помощью Elapsed свойства.
Stopwatch Экземпляр выполняется или останавливается; используется для IsRunning определения текущего состояния объектаStopwatch. Используется Start для начала измерения затраченного времени; используется Stop для остановки измерения затраченного времени. Запрос значения затраченного времени с помощью свойств ElapsedElapsedMillisecondsили ElapsedTicks. Вы можете запросить затраченные свойства времени во время выполнения или остановки экземпляра. Свойства затраченного времени постоянно увеличиваются во время Stopwatch выполнения; они остаются постоянными при остановке экземпляра.
По умолчанию затраченное значение времени экземпляра Stopwatch равно общему значению всех измеренных интервалов времени. Каждый вызов Start начинает подсчет в совокупное затраченное время; каждый вызов заканчивает Stop текущее измерение интервала и зависает совокупное значение затраченного времени. Reset Используйте метод для очистки совокупного затраченного времени в существующем Stopwatch экземпляре.
Меры Stopwatch , прошедшие время путем подсчета тактов таймера в базовом механизме таймера. Если установленное оборудование и операционная система поддерживают счетчик производительности с высоким разрешением, Stopwatch класс использует этот счетчик для измерения затраченного времени. В Stopwatch противном случае класс использует системный таймер для измерения затраченного времени. Frequency Используйте поля для IsHighResolution определения точности и разрешения Stopwatch реализации времени.
Класс Stopwatch помогает управлять счетчиками производительности, связанными с временем, в управляемом коде. В частности, Frequency поле и GetTimestamp метод можно использовать вместо неуправляемых Windows API QueryPerformanceFrequency и QueryPerformanceCounter .
На компьютере с несколькими обработчиками не имеет значения, на каком процессоре выполняется поток. Однако из-за ошибок в BIOS или аппаратном уровне абстракции (HAL) можно получить разные результаты времени на разных процессорах. Чтобы указать сходство процессора для потока, используйте ProcessThread.ProcessorAffinity метод.
Конструкторы
Инициализирует новый экземпляр класса Stopwatch.
Получает частоту таймера в виде количества тактов в секунду. Это поле доступно только для чтения.
Указывает, зависит ли таймер от счетчика производительности высокого разрешения. Это поле доступно только для чтения.
Свойства
Получает общее затраченное время, измеренное текущим экземпляром.
Получает общее затраченное время в миллисекундах, измеренное текущим экземпляром.
Получает общее затраченное время в тактах таймера, измеренное текущим экземпляром.
Получает значение, указывающее, запущен ли таймер Stopwatch.
Методы
Определяет, равен ли указанный объект текущему объекту.
Служит хэш-функцией по умолчанию.
Получает текущее число тактов временного механизма.
Возвращает объект Type для текущего экземпляра.
Создает неполную копию текущего объекта Object.
Останавливает измерение интервала времени и обнуляет затраченное время.
Останавливает измерение интервала времени, обнуляет затраченное время и начинает измерение затраченного времени.
Запускает или возобновляет измерение затраченного времени для интервала.
Инициализирует новый экземпляр Stopwatch, задает свойство затраченного времени равным нулю и запускает измерение затраченного времени.
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Предоставляет набор методов и свойств, которые можно использовать для точного измерения затраченного времени.
Примеры
В следующем примере показано, как использовать Stopwatch класс для определения времени выполнения приложения.
В следующем примере показано использование Stopwatch класса для вычисления данных о производительности.
Комментарии
Stopwatch Экземпляр может измерять затраченное время на один интервал или общее время, прошедшее через несколько интервалов. В типичном Stopwatch сценарии вы вызываете Start метод, а затем в конечном итоге вызываете Stop метод, а затем проверяете прошедшее время с помощью Elapsed свойства.
Stopwatch Экземпляр выполняется или останавливается; используется для IsRunning определения текущего состояния объектаStopwatch. Используется Start для начала измерения затраченного времени; используется Stop для остановки измерения затраченного времени. Запрос значения затраченного времени с помощью свойств ElapsedElapsedMillisecondsили ElapsedTicks. Вы можете запросить затраченные свойства времени во время выполнения или остановки экземпляра. Свойства затраченного времени постоянно увеличиваются во время Stopwatch выполнения; они остаются постоянными при остановке экземпляра.
По умолчанию затраченное значение времени экземпляра Stopwatch равно общему значению всех измеренных интервалов времени. Каждый вызов Start начинает подсчет в совокупное затраченное время; каждый вызов заканчивает Stop текущее измерение интервала и зависает совокупное значение затраченного времени. Reset Используйте метод для очистки совокупного затраченного времени в существующем Stopwatch экземпляре.
Меры Stopwatch , прошедшие время путем подсчета тактов таймера в базовом механизме таймера. Если установленное оборудование и операционная система поддерживают счетчик производительности с высоким разрешением, Stopwatch класс использует этот счетчик для измерения затраченного времени. В Stopwatch противном случае класс использует системный таймер для измерения затраченного времени. Frequency Используйте поля для IsHighResolution определения точности и разрешения Stopwatch реализации времени.
Класс Stopwatch помогает управлять счетчиками производительности, связанными с временем, в управляемом коде. В частности, Frequency поле и GetTimestamp метод можно использовать вместо неуправляемых Windows API QueryPerformanceFrequency и QueryPerformanceCounter .
На компьютере с несколькими обработчиками не имеет значения, на каком процессоре выполняется поток. Однако из-за ошибок в BIOS или аппаратном уровне абстракции (HAL) можно получить разные результаты времени на разных процессорах. Чтобы указать сходство процессора для потока, используйте ProcessThread.ProcessorAffinity метод.
Конструкторы
Инициализирует новый экземпляр класса Stopwatch.
Получает частоту таймера в виде количества тактов в секунду. Это поле доступно только для чтения.
Указывает, зависит ли таймер от счетчика производительности высокого разрешения. Это поле доступно только для чтения.
Свойства
Получает общее затраченное время, измеренное текущим экземпляром.
Получает общее затраченное время в миллисекундах, измеренное текущим экземпляром.
Получает общее затраченное время в тактах таймера, измеренное текущим экземпляром.
Получает значение, указывающее, запущен ли таймер Stopwatch.
Методы
Определяет, равен ли указанный объект текущему объекту.
Служит хэш-функцией по умолчанию.
Получает текущее число тактов временного механизма.
Возвращает объект Type для текущего экземпляра.
Создает неполную копию текущего объекта Object.
Останавливает измерение интервала времени и обнуляет затраченное время.
Останавливает измерение интервала времени, обнуляет затраченное время и начинает измерение затраченного времени.
Запускает или возобновляет измерение затраченного времени для интервала.
Инициализирует новый экземпляр Stopwatch, задает свойство затраченного времени равным нулю и запускает измерение затраченного времени.
Для лабораторной работы нужно измерить время выполнения нескольких операций. Код:
Код работает, но ResultTime в конце равно 0 . Это нормально?
2 ответа 2
Измерение времени операции — на самом деле сложный момент, тут есть много тонкостей.
Первая тонкость — JIT warm-up: когда метод исполняется в первый раз, происходит JIT-компиляция кода этого метода. Поэтому чтобы получить правильное время, необходимо перед измерением выполнить измеряемый код «вхолостую».
Следующая тонкость: при запуске из-под отладчика JIT-компилятор даже в Release mode оптимизирует ваш код не очень агрессивно, чтобы в отладчике всё ещё были видны нужные переменные и стек вызовов. Запускайте ваши тесты из-под командной строки вне Visual Studio.
Следующая тонкость: если ваш измеряемый метод не производит побочных эффектов и не возвращает значения, или возвращаемое значение игнорируется, то оптимизатор может выбросить его вызов. Поэтому обязательно выводите возвращаемое значение на экран.
Следующая тонкость: метод может быть очень быстрым, и сумманое время выполнения может оказаться в пределах разрешения используемого вами таймера. Для того, чтобы реально измерить его скорость, нужно выполнить его N раз, и суммарное время поделить на N . Число N проще всего подобрать экспериментально.
Следующая тонкость: различные таймеры имеют различное разрешение. Лучше брать более точный таймер. Я, например, использую Stopwatch , о котором говорит @Denis Bubnov в своём ответе.
Следующая тонкость: выполнение может быть прервано различными внешними событиями. Например, системный планировщик потоков может отобрать квант времени у вашего потока, в результате измеренное значение будет больше, чем реальное время пробега метода. Или сборщик мусора может заморозить ваш поток. Поэтому имеет смысл проводить измерения несколько раз, и отбрасывать результаты, которые статистически слишком далеко отстоят от среднего значения.
Следующая тонкость: различные системные кеши. Например, если ваш код читает файл, то после первого чтения файл окажется в кеше операционной системы, и последующие выполнения того же метода будут быстрее. Поэтому в таком случае каждая новая итерация должна читать новый файл.
Практически, учитывать эти штуки в своём коде каждый раз лень. Поэтому имеет смысл воспользоваться фреймворком для бенчмарков. Например, можно использовать BenchmarkDotNet. В этом случае ваш код будет выглядеть так:
I have written a c++ program , I want to know how to calculate the time taken for execution so I won't exceed the time limit.
this is my program and i want it to be within time limit 3 sec !! how to do it ? yeah sorry i meant execution time !!
@mekasperasky: You should always fix all the parts of your question that are wrong. Don't simply add a little edit at the end. Fix the title, fix all the other places where it says "compilation".
8 Answers 8
If you have cygwin installed, from it's bash shell, run your executable, say MyProgram , using the time utility, like so:
This will report how long the execution of your program took -- the output would look something like the following:
You could also manually modify your C program to instrument it using the clock() library function, like so:
Note that clock() gets overall execution time. So if you use it with multithreaded code, you might get a result bigger, than you expect.
With C++11 for measuring the execution time of a piece of code, we can use the now() function:
If you want to print the time difference between start and end in the above code, you could use:
If you prefer to use nanoseconds, you will use:
The value of the diff variable can be also truncated to an integer value, for example, if you want the result expressed as:
For more info click here
OVERVIEW
I have written a simple semantic hack for this using @AshutoshMehra response. You code looks really readable this way!
MACRO
USAGE
OUTPUT
Note: the question was originally about compilation time, but later it turned out that the OP really meant execution time. But maybe this answer will still be useful for someone.
For Visual Studio: go to Tools / Options / Projects and Solutions / VC++ Project Settings and set Build Timing option to ' yes '. After that the time of every build will be displayed in the Output window.
This looks like Dijstra's algorithm. In any case, the time taken to run will depend on N. If it takes more than 3 seconds there isn't any way I can see of speeding it up, as all the calculations that it is doing need to be done.
Depending on what problem you're trying to solve, there might be a faster algorithm.
I have used the technique said above, still I found that the time given in the Code:Blocks IDE was more or less similar to the result obtained-(may be it will differ by little micro seconds)..
If you are using C++ then you should try this below code as you would always get 0 as answer if you directly use @Ashutosh Mehra's answer.
Because in C++ you the float and double values will directly be rounded off. So I used the cout.precision(10) to set the output precision of any value to 10 digits after decimal.
(Note that a half decent compiler would have to be prevented from generating no code at all for the nested loops - one possible explanation for the problem sree mentions. This could be impeded by
You can try below code for c++:
Not the answer you're looking for? Browse other questions tagged c++ execution-time or ask your own question.
Linked
Related
Hot Network Questions
To subscribe to this RSS feed, copy and paste this URL into your RSS reader.
Site design / logo © 2022 Stack Exchange Inc; user contributions licensed under cc by-sa. rev 2022.5.6.42057
Читайте также: