Как замерить время работы программы

Всем привет!
Я написал программу с использованием MPI (Message Passing Interface).
Мне нужно замерить время работы всей программы и отдельных ее частей. Для замера времени использовал функцию MPI_Wtime(). Программа выдавала не такие результаты, какие мне были нужны. Тогда я стал разбираться в чем же дело, писать различные тесты и т.д.

И вот один из тестов показал мне странный результат: я замерил время работы ДВУХ операций сложения чисел типа double и время работы ЧЕТЫРЕХ операций сложения чисел типа double. В результате получилось, что время работы четырех сложений почти такое же как и для двух сложений. Если подумать, то время работы двух сложений должно быть почти в два раза меньше, чем четырех.

Может я что-то не учитываю или неправильно понимаю. Очень нужна помощь, т.к. сроки поджимают! У кого есть какие либо предположения или может кто-то знает в чем дело — поделитесь знаниями пожалуйста. Код описанного теста ниже (он простой и его не так много, как кажется). Результат двух операций сложения выводится как «Oper Time 1», четырех операций — «Oper Time 2».

Настраиваем CLion, часть 1: параметры оптимизации, ввод из файла и время работы программы


#include #include #include #include using namespace std; //—————————————————————————————— int main(int argc, char* argv[]) < double N = 100000000; double StartOper1, EndOper1, StartOper2, EndOper2; int namelen, numprocs, rank; char processor_name[MPI_MAX_PROCESSOR_NAME]; MPI_Init(argv); MPI_Comm_size(MPI_COMM_WORLD, MPI_Comm_rank(MPI_COMM_WORLD, MPI_Get_processor_name(processor_name, cout; EndOper1 = MPI_Wtime(); cout; EndOper2 = MPI_Wtime(); cout;
Форумчанин
Регистрация: 29.09.2010
Сообщений: 636

эти сложения выполняются за такое ничтожное время что там и мерять то нечего

можешь также попробывать убрать все оптимизации компилятора.

Форумчанин
Регистрация: 16.09.2011
Сообщений: 114

эти сложения выполняются за такое ничтожное время что там и мерять то нечего

Но я ведь в цикле гоняю, поэтому за 100000000 шагов цикла должна накопиться приличная разница

можешь также попробывать убрать все оптимизации компилятора.

Пользуюсь Visual Studio. Там в свойствах проекта указано, что оптимизация выключена.
Форумчанин
Регистрация: 29.09.2010
Сообщений: 636

Но я ведь в цикле гоняю, поэтому за 100000000 шагов цикла должна накопиться приличная разница

ну ок, а точно ВСЕ оптимизации выключены?
Форумчанин
Регистрация: 16.09.2011
Сообщений: 114

Ну я смотрел так: Проект -> Свойства -> С/С++ -> Оптимизация
Там в верхней строке написано, что отключено. Да и в других строках тоже самое. Я сам сначала думал на оптимизацию, стал в интернете искать как отключить. Нашел где посмотреть (описано в первой строке). Там посмотрел — оказалось что выключено. Пробовал писать #pragma optimize(«», off) — результат не изменился

Читайте также:
Программа для удаления файлов которые были удалены

Урок на делфи 59. замерить время выполнения кода

Источник: www.programmersforum.ru

progtask.ru

В этой статье я расскажу вам, как замерить время работы вашей программы в C#.

Программный код с пояснениями ниже:

Замер времени в C#
using System ;
using System . Diagnostics ; // подключаем пространство имён, в котором находится класс Stopwatch
using System . Threading ;
namespace TimeSpent
class Program
static void Main ( string [ ] args )
Stopwatch time = new Stopwatch ( ) ; // создаём объект Stopwatch
time . Start ( ) ; // запускаем отсчёт времени
Thread . Sleep ( 2000 ) ; // останавливаем работу программы на 2 секунды
time . Stop ( ) ; // останавливаем работу
Console . WriteLine ( time . Elapsed ) ; // выводим затраченное время
time = Stopwatch . StartNew ( ) ; // новый экземпляр Stopwatch
Thread . Sleep ( 1500 ) ; // останавливаем работу программы на 1.5 секунды

Console . WriteLine ( time . Elapsed ) ; // выведет 1.5 секунды, а не 3.5, так как мы перезаписали time

time . Restart ( ) ; // перезапускаем отсчёт времени
Thread . Sleep ( 500 ) ; // программа засыпает на 0.5 секунды
time . Reset ( ) ; // скидывает текущее значение

Console . WriteLine ( time . Elapsed ) ; // в этом случае ничего выведено не будет, т.к. время было сброшено

Console . ReadKey ( ) ;

результат замера времени работы в C#

Если есть вопросы, приглашаю в комментарии.

(5 оценок, среднее: 5,00 из 5)

Свежие записи

  • Отправка SMS при помощи C# и Twilio
  • Работа с Punycode в C#
  • Валидация XML при помощи XSD в C#
  • Определение кодировки файла при помощи C#
  • Отправка email при помощи C#

Свежие комментарии

  • mel к записи Работа с таблицами в Word при помощи VBScript (VBS)
  • admin к записи Озвучка текста в C#
  • Алена к записи Озвучка текста в C#

Архивы

Рубрики

Мета

Как измерить время работы программы c

No Image

Для чего знать время выполнения? Всегда хочется,чтобы наша программа работала как можно быстрее.

Иногда этого можно добиться просто заменив методы более быстрыми. Например иногда используют для проверки наличия строки в тексте метод IndexOf, тогда как метод Contains как минимум в 2 раза быстрее сделает эту же проверку. Замерив время нескольких методов, которые могут выполнить вашу задачу, логичнее выбрать тот который выполняется быстрее остальных.

Как узнать время выполнения?

Для замеров времени можно использовать класс Stopwatch

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

3 ответа 3

В общем, вам нужен профайлер, который покажет сколько какой участок кода работал, сколько раз вызывался и т.п. Если профайлер по каким-то причинам не пригоден – можно использовать получение времени в начале и конце участка кода, но время исполнения участка кода должно быть много больше кванта времени. Конкретные способы:

  • time() – кроссплатформенно, квант 1 с.
  • GetTickCount() – Win, квант 1 мс.
  • QueryPerformanceCounter() – Win, кванты мелкие.
  • rdtsc – любая ос на x86/x64, считает такты процессора
Читайте также:
Как ускорить видео в программе vsdc free video editor

Для измерения интервалов времени в С++ есть std::chrono::steady_clock и high_resolution_clock :

Точность зависит от ОС, high_resolution_clock может быть точнее чем steady_clock, однако они могут быть не монотонными (на них может влиять синхронизация времени ОС).

Для очень маленьких интервалов времени можно использовать инструкцию процессора rdtsc (ReaD TicS Counter), которая возвращает количество тактов процессора. В VC++ для этого есть интринсик __rdtsc() , в G++ надо использовать встроенный ассемблер. Однако для правильных измерений с помощью rdtsc надо соблюсти несколько условий:

  • перед rdtsc надо выполнить инструкцию cpuid , чтобы очистить конвейер процессора
  • надо отключить Hyper-Threading, если он включен
  • надо исключить влияние переключения контекстов потока – измерение должно быть коротким (менее 20 мс на Windows), надо принудительно переключить контекст потока перед началом измерений ( SwitchToThread в Windows), желательно привязать поток к одному ядру процессора (у каждого ядра свой счетчик тактов).
  • не надо пытаться переводить такты во время, т.к. частота процессора может меняться.
  • из результата надо вычесть время работы инструкций cpuid и rdtsc (

Примерный код выглядит следующим образом (Windows, MS VC++):

Обновл. 16 Июн 2019 |

Иногда, в процессе написания кода, вы можете столкнуться с ситуациями, когда не будете уверены, какая из двух функций окажется более эффективной (предполагается, что конечный результат у обоих функций одинаковый). Как это определить?

Один из самых простых способов — засечь время выполнения каждого из фрагментов кода. В C++11 это делается через библиотеку chrono. Мы можем легко инкапсулировать весь необходимый нам функционал в класс, который затем будем использовать в наших собственных программах.

Для его использования нужно определить объект класса Timer в верхней части функции main() (или откуда вы хотите начинать отсчёт), а затем просто вызвать метод elapsed() после части кода, которую вы проверяете:

Рассмотрим реальный пример, где нужно отсортировать массив из 10 000 элементов. Воспользуемся алгоритмом сортировки методом выбора:

На компьютере автора результат трёх прогонов кода: 0.0508 , 0.0507 и 0.0499 , т.е. около 0.05 секунды.

Теперь проделаем то же самое, но с std::sort из стандартной библиотеки C++:

Результаты трёх прогонов на компьютере автора: 0.000694 , 0.000693 и 0.000697 , т.e. около 0.0007 секунды.

Таким образом, std::sort в 75 раз быстрее, чем сортировка, которую мы написали сами!

Читайте также:
Проблемы программы информационное общество

Что влияет на тайминг кода?

Тайминг кода является достаточно простым и прозрачным, но ваши результаты могут существенно отличаться из-за ряда вещей:

Во-первых, убедитесь, что вы используете режим конфигурации Release, а не Debug. Во время режима Debug оптимизация обычно отключена, а она может оказывать значительное влияние на результаты. Например, в конфигурации Debug, выполнение сортировки элементов массива через std::sort на компьютере автора заняло 0.0237 секунды — в 34 раза больше, нежели в конфигурации Release!

Во-вторых, на результаты тайминга влияют процессы, которые ваша система может выполнять в фоновом режиме. Для достижения наилучших результатов убедитесь, что ваша ОС не делает ничего, что интенсивно нагружает процессор, жёсткий диск (например, запущен поиск файла или сканирование антивирусом) или расходует много памяти (например, вы играете в игры или работаете в фото или видео редакторе).

Выполняйте тайминг как минимум 3 раза. Если результаты одинаковые — выбираем среднее. Если один или два результата значительно отличаются друг от друга, то запустите тайминг ещё несколько раз, пока не получите лучшее представление о том, какие из результатов оказались «левыми». Обратите внимание, некоторые, казалось бы, невинные вещи, такие как веб-браузеры, могут временно увеличить нагрузку на ваш процессор до 100%, когда сайт, на котором вы находитесь в фоновом режиме, выполняет сразу целую кучу скриптов JavaScript (рекламные баннеры, запуск видео, сложная анимация и т.д.). Запуск тайминга несколько раз позволит определить, повлияло ли подобное событие на ваши результаты.

В-третьих, при сравнении двух фрагментов кода старайтесь не запускать ничего лишнего в фоновом режиме при пригонах, так как это также может повлиять на результаты тайминга. Возможно, ваш антивирус начал сканирование в фоновом режиме, или, может быть, вы решили послушать музыку в стриминговом сервисе (и это всё в перерывах между прогонами).

Рандомизация также может повлиять на тайминг. Если бы мы отсортировали массив, заполненный случайными числами, то это бы повлияло на результаты тайминга (тот факт, что числа являются рандомными). Рандомизацию использовать можно, но убедитесь, что ваше стартовое значение является фиксированным (т.е. не используйте системные часы в качестве стартового значения) и результаты рандомизации идентичны при каждом запуске. Кроме того, убедитесь, что в фрагментах кода не используется пользовательский ввод, так как время ожидания ввода от пользователя не должно учитываться при определении эффективности кода.

Наконец, ваши результаты действительны только для архитектуры вашего компьютера, ОС, компилятора и системных/технических характеристик. Вы можете получить совсем другие результаты в других системах, которые имеют другие сильные и слабые стороны.

Источник: 4systems.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru