Как замерить время выполнения части кода в C?
Если говорить о мире Unix, то можно использовать gprof профайлер.
Отслеживать
ответ дан 28 окт 2010 в 19:30
Nicolas Chabanovsky Nicolas Chabanovsky
51.2k 86 86 золотых знаков 266 266 серебряных знаков 505 505 бронзовых знаков
Не могли бы вы объяснить по-подробней?
30 апр 2011 в 18:51
#include #include int add(int x, int y) < return x + y; >double measure () < struct tms begin, end; /* Начать измерение */ times(&begin); /* Выполнить измеряемое действие */ add(0, 0); /* Завершить измерение */ times(&end); return (double)(end.tms_utime - begin.tms_utime); >
Отслеживать
ответ дан 29 окт 2010 в 11:00
34.5k 25 25 золотых знаков 97 97 серебряных знаков 214 214 бронзовых знаков
Если пишите для Win32, то лучше всего воспользоваться высокоточными функциями, такими, как, например, QueryPerformanceCounter или timeGetTime. Для Linux — тоже копать в направлении счетчиков производительности процессора. Я лично для реализации использовал QueryPerformanceCounter и частично исходный код вот этой статьи:
-там можно разобраться что и как работает. К сожалению, это было давно, и сейчас у меня нет на руках тех исходников.
Однако, для тривиальных функций, как в Вашем примере, я не вижу особого смысла для замера производительности (наверное, это просто взято как пример).
Как найти время работы программы на С++
У многих начинающих программистов рано или поздно возникает вопрос: «Как найти время работы программы?». В интернете много ответов на данный вопрос: написать свой мини-дебаггер, посчитать количество тактов и т. д. Самый простой вариант — это посчитать разницу между начальным временем и конечным. То есть, есть начальное значение времени, после которого объявлен фрагмент кода, время выполнения которого необходимо измерить. После фрагмента кода фиксируется ещё одно, конечное, значение времени. После чего, из конечного значения времени вычитаем начальное время и получим время, за которое выполнился измеряемый фрагмент кода или вся программа. Время работы программы необходимо найти для того, чтобы проверить, насколько эффективнее стал работать отдельный алгоритм или программа в целом! Как это сделать,смотрите ниже.
// Как найти время работы фрагмента кода? // заголовочный файл с прототипом функции clock() #include // . unsigned int start_time = clock(); // начальное время // здесь должен быть фрагмент кода, время выполнения которого нужно измерить unsigned int end_time = clock(); // конечное время unsigned int search_time = end_time - start_time; // искомое время
Для того, чтобы найти время работы программы, нужно воспользоваться функцией clock() . Прототип функции clock() находится в заголовочном файле , который нужно подключить, строка 4. Функция clock() возвращает значение времени в миллисекундах (1с = 1000млс). Причём отсчёт времени начинается с момента запуска программы. Если надо измерить работу всей программы, то в конце программы, перед оператором return 0; нужно запустить функцию clock() , которая покажет рабочее время. Для поиска времени работы фрагмента кода нужно найти разницу между конечным и начальным временем, как показано выше.
// Как найти время работы программы? // заголовочный файл с прототипом функции clock() #include // . // здесь должен быть код программы, время выполнения которой нужно измерить unsigned int end_time = clock(); // время работы программы
Разработаем программу, в которой с помощью функции clock() вычислим время работы программы. Программа ищет минимальное значение в массиве размером в 200000 элементов. Размер массива специально выбран большим, для того, чтобы было заметно, как работает программа. Так как числа генерируются случайно, то при каждом запуске получается новый случай, и время может не совпадать. К тому же, время выполнения программы зависит от того, насколько загружен компьютер и от того, какая у компьютера вычислительная мощность. На разных машинах по-разному будет затрачиваться время на выполнение программы, на более мощных компьютерах затрачиваемое время будет меньше и наоборот.
// runtime.cpp: определяет точку входа для консольного приложения. // Как найти время работы программы? #include "stdafx.h" #include #include using namespace std; int main(int argc, char* argv[]) < srand(time(0)); const int array_size = 200000; // размер одномерного массива int array1[array_size]; // объявление одномерного массива for (int counter = 0; counter < array_size; counter++) < array1[counter] = rand() % 50 - rand() % 50; // заполняем массив случайными значениями в диапазоне от -49 до 49 включительно cout int min = array1[0]; // переменная для хранения минимального значения for (int counter = 1; counter < array_size; counter++) < if ( min >array1[counter] ) // поиск минимального значения в одномерном массиве min = array1[counter]; > cout
// runtime.cpp: определяет точку входа для консольного приложения. // Как найти время работы программы? #include #include #include using namespace std; int main(int argc, char* argv[]) < srand(time(0)); const int array_size = 200000; // размер одномерного массива int array1[array_size]; // объявление одномерного массива for (int counter = 0; counter < array_size; counter++) < array1[counter] = rand() % 50 - rand() % 50; // заполняем массив случайными значениями в диапазоне от -49 до 49 включительно cout int min = array1[0]; // переменная для хранения минимального значения for (int counter = 1; counter < array_size; counter++) < if ( min >array1[counter] ) // поиск минимального значения в одномерном массиве min = array1[counter]; > cout
В строке 26 запускается функция clock() , которая скажет сколько потребовалось время программе. Разбирать алгоритм поиска не нужно, так как это совсем другая тема. Главное, нужно понять, как использовать функцию clock() , для поиска времени работы программы или отдельного фрагмента кода. А именно, в строке 26, после основного кода программы, но до оператора return 0; объявлена функция clock() , которая вернёт значение времени. Результат работы программы (см. Рисунок 1).
CppStudio.com
-13 4 -2 30 8 9 27 10 11 -14 -31 1 6 -16 38 31 38 -26 22 21 13 16 42 11 2 11 25 12 0 3 -7 -38 -8 -4 0 42 29 -27 -8 6 -24 12 -12 -5 27 -21 11 5 -28 33 -6 -27 19 8 -24 -4 20 -33 16 13 30 38 -3 25 -8 30 13 -19 -7 -19 12 11 -11 -14 -33 12 -5 -2 7 10 16 -14 -23 10 -10 4 -19 15 27 20 23 -5 34 12 19 -19 -13 30 -11 6 -7 -16 27 -11 -19 -9 26 -3 0 -7 41 -3 -31 10 2 -4 5 15 -37 6 -10 -10 25 -28 7 17 19 -38 15 12 -27 -48 6 36 -35 18 -17 -20 28 -13 -32 -27 7 38 16 1 25 -16 -10 5 -26 31 -15 8 22 13 6 -5 11 -31 -3 -31 10 8 -3 19 -43 8 -29 -21 -8 3 44 32 -5 9 -23 19 -6 3 6 -7 -9 23 -31 2 -19 -2 -3 -5 -5 36 12 -14 21 5 9 10 13 21 -21 12 12 14 18 -27 - 26 -6 -6 -46 7 12 -16 -24 -26 18 -1 9 2 15 -12 17 20 19 -6 0 -1 -16 11 26 -12 0 -28 12 -26 -2 23 -1 0 11 -13 -34 6 22 4 -35 37 15 -15 -26 31 25 -4 2 19 0 7 -21 26 -1 -13 37 28 -13 4 22 22 5 34 2 8 6 -15 -1 25 25 0 22 -17 3 -27 1 43 8 41 -25 12 -15 32 -14 -6 -2 24 22 -33 0 -31 32 17 -32 -22 22 -32 0 3 -24 7 2 40 -28 -39 24 -5 12 -1 -1 27 min = -49 runtime = 59.449 Для продолжения нажмите любую клавишу . . .
Рисунок 1 — Как найти время работы программы
На рисунке 1 видно, что время выполнения программы приблизительно равно 59 секунд. Даже если элементы массива неизменны, время всё равно будет немного отличаться при повторном запуске программы, так как некоторые ресурсы компьютера постоянно будут заняты, а значит, не доступны программе. Если Вы запустите эту программу у себя на компьютере, то время выполнения программы может быть совсем другим, так как наши машины не идентичны.
Как засечь время выполнения функции?
В нашей программе бинарного поиска внутри цикла осуществляются две проверки, хотя
могла быть только одна (при увеличении числа проверок вне цикла). Напишите программу, предусмотрев в
ней одну проверку внутри цикла. Оцените разницу во времени выполнения.
как новичку без серьезных описаний и дополнений кода засечь время выполнения функции? работаю в QT
Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Время выполнения Функции
Всем привет, можно ли замерить скорость в цикле из 50-10 проходов? Пробывал gettimeofday, но он.
Как ограничить время выполнения программы?
Добрый день! Задали написать программу, следующего содержания: "Для натурального числа сумма.
Мьютексы-потоки: Как задать время выполнения потока
Подскажите пожалуйста насчет следующих вопросов, сам не разобрался. 1. Как задать время.
Как измерить время выполнения программы с использованием RDTSC
Мне нужно используя RDTSC (как я понял, это ассемблерной вставкой делать нужно) посчитать время.
Native x86
![]()
5187 / 3033 / 875
Регистрация: 13.02.2013
Сообщений: 9,635
Взять системное время до запуска, и отнять его от времени после завершения?
Регистрация: 16.12.2016
Сообщений: 716
подробнее хотя бы немного какая функция за это из какой библиотеки отвечает?
Форумчанин
![]()
![]()
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
1 2 3 4 5 6 7 8 9 10 11 12 13 14
#include #include #include int main(void) { time_t start = time(NULL); /* some work */ Sleep(3000); printf("Seconds: %d\n", time(NULL) - start); return 0; }
![]()
![]()
36829 / 19877 / 4166
Регистрация: 12.02.2012
Сообщений: 33,013
Записей в блоге: 13
Если нужна хорошая точность, нужно использовать системную функцию getTickCount
Регистрация: 16.12.2016
Сообщений: 716
я не совсем понял по описанию как ей посчитать, для примера есть код из задачи, две функции, как засечь каждую из них?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
#include #define MAX 100 int binsearch1(int x, int n, int v[]); int binsearch2(int x, int n, int v[]); int main() { int n = MAX; int x = 33; int v[MAX]; for (int i = 0; iMAX; i++){ v[i]=i; } printf ("%d\n",binsearch1(x,n,v)); printf ("%d\n",binsearch2(x,n,v)); return 0; } int binsearch1(int x, int n, int v[]) { int min, mid, max; min = 0; max = n-1; while (minmax){ mid = (min+max)/2; if (xv[mid]){ max = mid-1; } else if (x>v[mid]){ min = mid+1; } else{ return mid; } } return -1; } int binsearch2(int x, int n, int v[]) { int min, mid, max; min = 0; max = n-1; while (minmax){ mid = (min+max)/2; if (xv[mid]){ max = mid; } else { min = mid+1; } } return x == v[mid] ? mid : -1; }
Добавлено через 10 минут
возможно я не верно выразился и есть какие то простые методы оценки разницы выполнения по времени
Как засечь время выполнения программы в c
I_lOVE_ROMAN → Time Complexity Calculation
-kirito- → Invitation to TheForces #25 (5^2-Forces, TheForces-Rated, Prizes!)
Imakf → Codeforces Round 906 (Div. 1, Div. 2)
GenGenM → Andvikpro тупой
abcsumits → Request to everyone, bully me!
whynesspower → [URGENT] Codeforces need anti-scrapping
purp4ever → Teams Qualified for Africa and Arab Collegiate Programming Championship — ACPC 2023 (+teens)
diskoteka → Codeforces Round #878 (Div.3) Разбор
tkm.algorithms → IOI 2027
Imakf → Codeforces Round 906 Editorial
atcoder_official → Panasonic Programming Contest 2023(AtCoder Beginner Contest 326) Announcement
chenjb → Rescheduling of World Finals 22&23
wittywho → CPH causing Compilation error but code runs fine on terminal
whynesspower → Reverse check the questions: ChatGPT
stdfloat → Is CF enough for IZHO, IOI?
127.0.0.1 → Codeforces Round 907 (Div. 2)
flamestorm → Codeforces Round 871 (Div. 4) Editorial
![]()
-arma- → SQRT decomposition for beginners
neo_30 → Maximum deletions in a string
arpit_aditya → Cherry Pickup Leetcode 741 — Why is this approach giving wrong Answer?
_Firdavs_Aminov_ → Dark theme Codeforces
elshiko → Квалификационный раунд Yandex Cup 2023
MercilesslyMan → Vim for competitive programming
AquaMoon → Harbour.Space Scholarship Contest 2023-2024 (Div. 1 + Div. 2) Editorial
74TrAkToR → Codeforces Round #904 (Div. 2) Editorial
Блог пользователя ioanisyan
Вопрос: Как измерить время выполнения программы
Автор ioanisyan, 12 лет назад ,
Как измерить время выполнения программы в миллисекундах ?
Комментарии (39)
Показать архивные | Написать комментарий?
12 лет назад , # |
← Rev. 3 →
+1 
#include #include int main() < double start = clock(); // Insert your code here printf("%.4lf\n", (clock() - start) / CLOCKS_PER_SEC); return 0; >
Выведет время программы в секундах, с дробной частью. Обычно CLOCKS_PER_SEC=1000, поэтому можно и в целых числах.
12 лет назад , # ^ |
Не очень точно, потому что clock() возвращает астрономическое время. При тестировании используется процессорное, а его изнутри программы я не знаю, как считать.
12 лет назад , # ^ |
Да, конечно. Я не думаю, что надо точно. Ну, под виндой можно сделать GetCurrentProcess() и вперёд с песней.
12 лет назад , # ^ |
под линухой можно запускать через time 🙂
12 лет назад , # ^ |
← Rev. 6 →
+5 
А разве clock() везде возвращает астрономическое время? В linux, например, $man 3p clock говорит:
NAME clock - report CPU time used SYNOPSIS #include clock_t clock(void); DESCRIPTION The clock() function shall return the implementation''s best approximation to the processor time used by the process since the beginning of an implementation-defined era related only to the process invocation.
12 лет назад , # ^ |
← Rev. 11 →
+8 
Я не понял последнего утверждения. Как связаны целые числа и то, чему равно CLOCKS_PER_SEC? Да и вообще говоря:
> man 3 clock
.
CONFORMING TO
C89, C99, POSIX.1-2001. POSIX requires that CLOCKS_PER_SEC equals
1000000 independent of the actual resolution.
offtop: пока отформатировал этот несчастный вывод чуть не помер. Что я делаю не так? В пяти тильдах не форматируется, пришлось руками, через html-код всё выравнивать. .
12 лет назад , # ^ |
Просили время в миллисекундах. Чтобы не домножать дабл на 1000 и творить чудеса, можно сделать всё в целых. man/POSIX под Windows? Не, не слышал 🙂 В MinGW 4.6.1 равен 1000.
12 лет назад , # ^ |
Похоже я невнимательно читаю: где-то пропустил, что речь о windows-specific ситуации?
12 лет назад , # ^ |
12 лет назад , # ^ |
Мне есть, чему у вас поучиться, Холмс! 🙂

12 лет назад , # ^ |
ну в таком случае и о С++ никто ничего не говорил:))
12 лет назад , # ^ |
Спасибо, но при одинаковых тестов времена выполнениев отличаются, чего посоветуете ?
12 лет назад , # ^ |
Это нормально, если несильно отличаются.

12 лет назад , # ^ |
посоветую посчитать среднее
12 лет назад , # ^ |
как раз речь о том, что использовать астрономическое время не совсем точно, оно сильно зависит от текущей загрузки системы. Процессорное — не зависит от того, что вы еще параллельно делаете
12 лет назад , # |
Под Windows можно использовать либо runexe (написано нами — Саратовским ГУ), либо run.exe (авторства ИТМО). Я рекомендую наш вариант 🙂 он не запускает код в дебаге, а иногда запуск в debug приводит к очень странным (читай неправльным( измерениям.
12 лет назад , # ^ |
Ага, иногда на порядок-другой время работы изменяется. А не знаете, зачем запускать в debug?
12 лет назад , # ^ |
Так они ловят некоторые events — типа, что программа создала другой процесс и видимо кое-что еще.

12 лет назад , # ^ |
Кажется это чаще всего происходит при работе с динамическими структурами или большой рекурсией.
12 лет назад , # ^ |
Кажется, утверждается, что под debug медленно работает delete. То есть если совсем много удаляется, то run.exe замедляет выполнение очень сильно. Кстати, интересно как они с этим борются на официальных соревнованиях. Представители ИТМО есть? Расскажете?
12 лет назад , # ^ |
Вроде есть какой-то хитрый ключ в реестре
12 лет назад , # ^ |
Интересно какой именно. Кстати, полезно-же опубликовать — иначе зачем run.exe вообще нужен? Ведь его важная задача определять время работы для околоолимпиадных целей, а там такие программы, где он будет лажать не редкость. Даже пользоваться как-то страшно. Или вот люди PCMS2 ставят, они это настраивают?
12 лет назад , # ^ |
Нужно прописать такой ключ HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\your_exe_name.exe
12 лет назад , # ^ |
Спасибо. Правильно я понимаю, что такое предполагается прописывать для каждого exe (напр., java, все интерпретаторы), а компилируемые переименовывать в какое-то хардкодное имя? your_exe_name.exe — это только имя файла, без пути? (например, main.exe ).
12 лет назад , # ^ |
Да, именно так. Ну либо написать обертку, которая добавит в реестр ключ для запускаемого файла, запустит, а потом ключ удалит (можно даже на cmd, при помощи reg add и reg delete)
12 лет назад , # ^ |
Спасибо , a как пользоваться runexe-ом ?
12 лет назад , # ^ |
runexe -h , но если просто хотите измерить время, то runexe solution.exe . Можно runexe -i input.txt -o output.txt solution.exe если хотите перенаправлять ввод/вывод на стандартный из файлов. Еще вариант runexe -t 2s -i input.txt -o output.txt solution.exe — это с ограничением по времени.
12 лет назад , # ^ |
Для Farа очень удобно поставить ассоциацию с типом файлов *.exe и по нажатию например на F4, чтобы запускался runexe. Всегда так делаю))

12 лет назад , # ^ |
Я как-то раз пробовал запускать runexe с указанием логина и пароля юзера, под правами которого я хотел чтоб программа запустилась. Но у меня это так и не получилось. Там видимо надо какие-то специальные привилегии настраивать? Тот же вопрос относится и к run.exe от ИТМО.

12 лет назад , # ^ |
Для run.exe надо так — допустим, мы работаем под аккаунтом Jury и хотим запустить под аккаунтом invoker. Тогда Jury навешиваем привилегии «Increase quotas» (SeIncreaseQuota) и «Replace a process level token» (SeAssignPrimaryToken), а invoker — «Log on as batch job» в Administrative Tools — Local Security Settings — Local Policies — User Right Assignment. У меня вдобавок Jury имеет администраторские права, что небезопасно, но отнимать не пробовал; надо попытаться 🙂
12 лет назад , # ^ |
Кстати, правильно ли я понимаю, что исходники файла /src/runlib/runlib32-static.lib закрыты? Если да, то можно ли узнать, в каких случаях выдаётся ошибка SECURITY_VIOLATION (т.е., за чем следит runexe)? Потому что, например, за работой с ФС вроде из общедоступных запускальщиков под Windows никто не следит.
12 лет назад , # ^ |
Проект открыт — первая ссылка в Google. Однако там почти нет этого кода, для этого используются другие технологии: они местами точные, местами эвристические, поэтому мы их не публикуем.

12 лет назад , # ^ |
Открыты (см. линк на странице проекта runexe).
5 лет назад , # ^ |
А планируется ли переезд runexe с закрытого хостинга на, скажем, GitHub?
12 лет назад , # |
Есть еще такая вещь, как QueryPerformanceCounter (вкупе с QueryPerformanceFrequency). Измеряет кол-во «тиков» процессора с момента запуска системы, поэтому выходит довольно точно. Не знаю, как в других средах, но как-то пробовал измерять время работы кода на Delphi, проблема была только одна — погрешность +/-0.5 ms (ибо на машине работают еще и другие программы, которые отнимают время). Ну, если совсем точно надо — можно посчитать раз 20 и найти среднее :))
12 лет назад , # ^ |
Приятней искать минимальное 🙂
12 лет назад , # |
← Rev. 2 →
0 
ptime — меряет хорошо. Можно скопировать в папку с прогой, время работы которой хочется измерить. Перенаправление ввода-вывода и вызов программы (предварительно перейдя в папку с ней): ptime program < input.txt >output.txt. Без перенаправления так: ptime program. Из замеченных глюков — иногда файлы долго открываются (не у всех, в частности наблюдаю у себя на винде, но это сбои ФС), и порой 500 мс можно легко скинуть (это уже экспериментировать со своей системой надо). Но на большинстве машин такого не наблюдается, и время показывается «нормальное».
12 лет назад , # |
← Rev. 2 →
+7 
P.S. in english version previous comments aren’t shown, no need to «vote down».
12 лет назад , # |
Подскажите, как при помощи run.exe запретить создание дочерних процессов? Например, вот такой код
#include using namespace std; int main()
run -y 3s a.exe
успешно выполняется. Время будет считаться до тех пор, пока блокнот не будет закрыт вручную. После этого, вердикт будет Idleness limit exceeded. Но хотелось бы, чтобы дочерние процессы убивались автоматически.