Время выполнения программы C++
Время выполнения программы на С++ можно узнать функцией clock(), возвращающей время прошедшее с запуска программы в миллисекундах.
#include // clock() #include // std::cout int main() < int sum = 0; // Результат вычислений for(int i = 0; i < 100000000; i++)< // Перебираем значения sum += i; // Вычисляем сумму значений >unsigned int end_time = clock(); // Время окончания вычислений std::cout
Если требуется узнать время выполнения блока кода, то нужно сохранить в переменную значение функции clock() перед выполнением блока и вычесть из значения clock() после выполнения.
#include // clock() #include // std::cout int main() < int sum = 0; // Результат вычислений unsigned int start_time = clock(); // Время начала вычислений for(int i = 0; i < 100000000; i++)< // Перебираем значения sum += i; // Вычисляем сумму значений >unsigned int end_time = clock(); // Время окончания вычислений std::cout
Понравилась страница?
Добавить в закладки
Или поделиться!
Время выполнения программы на языке Си. Функция clock().
Функция возвращает clock() число миллисекунд с момента запуска программы. Если нужно узнать время выполнения фрагмента программы то нужно сохранить значение возвращаемое clock() до и после фрагмента и по разности определить время. Теоретически время возвращаемое функцией может быть и не в миллисекундах, чтобы узнать время в секундах нужно разделить результат clock() на CLOCKS_PER_SEC (глобальная константа определенная в заголовочном файле time.h)
float time_sec = (float)clock() / CLOCKS_PER_SEC;
Ниже приведен пример программы с использованием функции clock() и выводом времени работы программы
#include //printf() #include // clock() int main() < double res = 0; // Результат for(long long i = 0; i < 100000000; i++)< res += i; // Суммируем >printf("res = %f \ntime = %ld ms \n", res, clock()); //> res = 4999999950000000.000000 time = 476 ms. Выводим результат и время выполнения программы в мс >
Понравилась страница?
Добавить в закладки
Или поделиться!
Как засечь время выполнения программы в c
Измерение временных интервалов в программах на языке Си
Для замера времени в программах на языке Си существуют несколько специальных библиотечных функций, таких как gettimeofday (), times (), clock (), : Некоторые из них являются специфичными для конкретных операционных систем, а некоторые относительно переносимы.
С измерением времени работы программы в многозадачной операционной системе, какими является Linux и Windows , связаны определенные трудности. Они обусловлены тем, что процессор всегда выполняет несколько процессов (программ) . Таким образом, если мы просто замерим время работы нашей программы, то в этот интервал попадут и какие-то другие процессы. Схематично это можно представить следующим образом:
начало замера времени
конец замера времени
Пусть на однопроцессорном компьютере активно выполняются 5 процессов (программ). Процессор в некотором порядке выполняет все эти программы — по одной в каждый интервал времени. Наша программа (процесс 2) запомнила значение времени до замеряемого участка кода, а потом после него, и вычислила временной интервал. На рисунке видно, что в этот интервал также попали и другие процессы, время исполнения которых нам совершенно не нужно измерять. Необходимо различать следующие времена, которые можно получить с помощью различных функций:
- Системное время — время, одинаковое для всех программ, работающих на данном компьютере. Функции gettimeofday (), например, возвращает значение относительно системного времени, поэтому оно содержит время работы посторонних процессов. Минимизировать это время можно, если во время замера убрать все другие программы, процессорное время.
- Время процесса — время, которое было потрачено на выполнение конкретного процесса (программы). По сути, именно его желательно получить. Для определения времени процесса в многозадачных операционных системах существуют различные библиотечные функции, специфичные для данной конкретной операционной системы.
Рассмотрим несколько способов измерения интервалов времени.
1. Использование функции gettimeofday ()
Функция gettimeofday () позволяет получить текущее значение системного времени. Достоинством этого способа измерения является относительно большая точность измерения.
Пример реализации в ОС Linux :
struct timeval tv1,tv2,dtv;
struct timezone tz ;
dtv.tv_sec = tv2.tv_sec -tv1.tv_sec;
return dtv.tv_sec *1000+dtv.tv_usec/1000;
Функция time_stop () возвращает время, прошедшее с запуска time _ start (), в миллисекундах. Пример использования:
printf («Time: %ld\n», time_stop ());
2. Использование функции times ()
Функция times () позволяет получить текущее время процесса. Получаемое время зависит от интервала времени прерываний по таймеру, которые использует планировщик задач, например в IA -32/ Linux — 10 ms , Alpha / Linux — 1 ms . Следовательно, недостатком этой функции является низкая точность на малых интервалах времени.
Пример реализации в ОС Linux :
struct tms tmsBegin,tmsEnd ;
Функция time_stop () возвращает время, прошедшее с запуска time _ start , в миллисекундах. Пример использования совпадает с приведенным выше.
3. Использование счетчика тактов процессора.
Практически каждый процессор имеет специальный встроенный регистр — счетчик тактов, значение которого можно получить специальной командой процессора. Команда процессора RDTSC ( Read Time Stamp Counter ) возвращает в регистрах EDX и EAX 64-разрядное беззнаковое целое, равное число тактов с момента запуска процессора. Вызвав эту команду до и после участка программы, для которого требуется вычислить время исполнения, можно вычислить разность показаний счетчика. Это равно числу тактов, затраченных на исполнение замеряемого участка. Для перехода от числа тактов к времени требуется умножить число тактов на время одного такта (величина, обратная тактовой частоте процессора). Для процессора с тактовой частотой 1ГГц время такта — 1 нс.
Достоинством этого способа является максимально возможная точность измерения времени.
Недостатки: команда получения числа тактов зависит от .архитектуры процессора.
Пример реализации в ОС Linux :
long long TimeValue =0;
unsigned long long time_RDTSC ()
struct dblword < long tl,th ; >dw ; // little endian
asm (» rdtsc \n»: «=a»( t.dw.tl ),»=d»( t.dw.th ));
long long time_stop ()
Функция time_stop возвращает число тактов процессора, прошедших с запуска time_start . Пример использования совпадает с приведенным выше.
4. Уменьшения влияния прочих факторов, искажающих измерения
В идеале следует замерять только саму исследуемую процедуру. Код инициализации (например, выделение памяти, заполнение массивов), деинициализации , файлового и консольного ввода и вывода должен обязательно быть вне замеряемого участка.
Прочие процессы в системе
Все современные ОС — многозадачные. Готовые задачи конкурируют за процессор. Кроме этого, они используют виртуальную и основную память и загружают кэш. Необходимо минимизировать число исполняемых процессов на машине в момент профилирования программы. Других счетных процессов и процессов, выделяющих много памяти, не должно быть в системе. Некоторые системные фоновые процессы устранить нельзя, они вносят искажения в измерения.
В современных ОС существует механизм отложенной записи на диск. Рекомендуется очистить буфер записи перед запуском исследуемой программы для уменьшения влияния предыстории. В ОС Linux для этого используется команда sync . Ее также можно выполнить прямо в программе на Си:
Как найти время работы программы на С++
У многих начинающих программистов рано или поздно возникает вопрос: «Как найти время работы программы?». В интернете много ответов на данный вопрос: написать свой мини-дебаггер, посчитать количество тактов и т. д. Самый простой вариант — это посчитать разницу между начальным временем и конечным. То есть, есть начальное значение времени, после которого объявлен фрагмент кода, время выполнения которого необходимо измерить. После фрагмента кода фиксируется ещё одно, конечное, значение времени. После чего, из конечного значения времени вычитаем начальное время и получим время, за которое выполнился измеряемый фрагмент кода или вся программа. Время работы программы необходимо найти для того, чтобы проверить, насколько эффективнее стал работать отдельный алгоритм или программа в целом! Как это сделать,смотрите ниже.
// Как найти время работы фрагмента кода? // заголовочный файл с прототипом функции 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 секунд. Даже если элементы массива неизменны, время всё равно будет немного отличаться при повторном запуске программы, так как некоторые ресурсы компьютера постоянно будут заняты, а значит, не доступны программе. Если Вы запустите эту программу у себя на компьютере, то время выполнения программы может быть совсем другим, так как наши машины не идентичны.