Мне нужно измерить время ввода и завершения мьютекса кода, поэтому я пишу это:
#include #include #include #include #include #include pthread_t tid[4]; int counter; pthread_mutex_t lock; void* doSomeThing(void *arg) < pthread_mutex_lock( time_t stime=time(NULL); unsigned long i = 0; counter += 1; printf(«n Job %d startedn», counter); for(i=0; i<(0xFFFF);i++)< // printf(«%d», i); //this is just wait >printf(«n Job %d finishedn», counter); time_t etime=time(NULL); printf(«time : %ldn», difftime(etime, stime)); pthread_mutex_unlock( return NULL; > int main(void) < int i = 0; int err; if (pthread_mutex_init( printf(«n mutex init failedn»); return 1; >while(i < 4) < err = pthread_create(doSomeThing, NULL); if (err != 0) printf(«ncan’t create thread :[%s]», strerror(err)); i++; >pthread_join(tid[0], NULL); pthread_join(tid[1], NULL); pthread_join(tid[2], NULL); pthread_join(tid[3], NULL); pthread_mutex_destroy( return 0; >
Но время я получаю 0
КАК ИЗМЕРИТЬ ВРЕМЯ ВЫПОЛНЕНИЯ ПРОГРАММЫ, КОДА, МЕТОДА, ФУНКЦИИ, ЗАПРОСА | C# STOPWATCH | C# ПЛЮШКИ
Решение
Существуют разные способы синхронизации времени — «настенное время», «процессорное время» — это два из них. Существуют разные библиотеки, которые помогут вам выполнить задачи синхронизации. Вот несколько из них:
Для CPU TIME (если у вас несколько потоков на нескольких CPU, это будет «быстрее, чем настенные часы»):
#include clock_t startTime, stopTime; double msecElapsed; startTime = clock(); // thing that needs timing stopTime = clock(); msecElapsed = (stopTime — startTime) * 1000.0 / CLOCKS_PER_SEC;
Обратите внимание на это может быть в состоянии синхронизировать с точностью до микросекунды — зависит от компилятора и платформы.
В течение РАСПОЛОЖЕННОГО (настенные часы) времени:
#include struct timeb start, stop; ftime( // thing that needs timing ftime( msecElapsed = timeDifference(stop);
Вам также нужна эта функция:
double timeDifference(struct timeb *start, struct timeb *stop) < return stop->time — start->time + 0.001 * (stim->millitm — start->millitm); >
Если вы используете OMP для облегчения параллельной обработки, у него есть удобная функция
#include double startTime, stopTime; startTime = omp_get_wtime(); // do things stopTime = omp_get_wtime();
Это обычно с точностью до микросекунды (даже если вы не использовали никаких других функций OMP).
Наконец — вы можете посмотреть на ответы на этот предыдущий вопрос а также этот для получения дополнительной информации / предложений.
Другие решения
time() Функция фактически возвращает секунды с 1 января 1970 года, а не миллисекунды. После быстрого Google, кажется, что решение может быть в функции clock (), которая обеспечивает время до миллисекунд (не проверено):
#include int main() < clock_t start, end; start = clock(); // do stuff end = clock(); std::cout
Источник: web-answers.ru
Как измерить время выполнения кода | Изучение С++ для начинающих. Урок #145
Измерить время исполнения кода на C/C++ с помощью функции clock()
Доброго времени суток! Представьте, вы написали очень крутую программу, она решает поставленную задачу, алгоритм отточен до мельчайших деталей, код отрефакторен так, что сам господь улыбнется при его чтении, все отлично! Вы пришли на работу(учебу, тусовку пограмистов) и всем его показали, и тут «Васек» спросит: «А быстро работает?». И тут вы понимаете свою ошибку!
Не измерили скорость работы программы! Не потестировали с разной нагрузкой, и вообще, там может быть куча дыр связанных, которые покажутся только при стрессовой нагрузке.
Ладно, хватит. На самом деле, я просто хотел написать о том, как измерить скорость исполнения любого участка кода. Сделать это можно на любом языке программирования, каждый язык каким либо образом да сможет обратиться к системе и спросить текущее время в миллисекундах.
Я расскажу про C/C++ просто потому что именно на этих языках чаще всего измерял скорость работы кода, для самых разнообразных учебных задач. От сортировки пузырьком до топологической сортировки графов.
Специальный тип данных clock_t в C/C++
Это не что иное, как алиас(кличка, переименование) стандартного арифметического типа данных. В значение ставится количество процессорных тиков с момента его запуска. Получить это значение можно с помощью функции clock() из библиотеки . Для того, чтобы перевести количество тиков в секунды используется константа из той же библиотеки CLOCKS_PER_SEC . Просто делим и получаем ответ.
//Специальный тип данных из библиотеки time.h clock_t currentTime; //Берем текущее системное время currentTime = clock(); //Участок кода, который нужно измерить for(int i = 0; i < 9000; i++) < i *= i; >//Берем разницу currentTime = clock() — currentTime; //Переводим в секунды currentTime = (double)currentTime / CLOCKS_PER_SEC;
Источник: mindhalls.ru
Как измерить время работы программы си
To calculate time taken by a process, we can use clock() function which is available time.h. We can call the clock function at the beginning and end of the code for which we measure time, subtract the values, and then divide by CLOCKS_PER_SEC (the number of clock ticks per second) to get processor time, like following.
Following is a sample C program where we measure time taken by fun(). The function fun() waits for enter key press to terminate.
Как замерить время выполнения части кода в C?
Если говорить о мире Unix, то можно использовать gprof профайлер.
Если пишите для Win32, то лучше всего воспользоваться высокоточными функциями, такими, как, например, QueryPerformanceCounter или timeGetTime. Для Linux — тоже копать в направлении счетчиков производительности процессора. Я лично для реализации использовал QueryPerformanceCounter и частично исходный код вот этой статьи:
-там можно разобраться что и как работает. К сожалению, это было давно, и сейчас у меня нет на руках тех исходников.
Однако, для тривиальных функций, как в Вашем примере, я не вижу особого смысла для замера производительности (наверное, это просто взято как пример).
Как измерить время работы программы си
конец замера времени
Пусть на однопроцессорном компьютере активно выполняются 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: %ldn», 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 dw ; // little endian
long long time_stop ()
Функция time_stop возвращает число тактов процессора, прошедших с запуска time_start . Пример использования совпадает с приведенным выше.
4. Уменьшения влияния прочих факторов, искажающих измерения
В идеале следует замерять только саму исследуемую процедуру. Код инициализации (например, выделение памяти, заполнение массивов), деинициализации , файлового и консольного ввода и вывода должен обязательно быть вне замеряемого участка.
Прочие процессы в системе
Все современные ОС — многозадачные. Готовые задачи конкурируют за процессор. Кроме этого, они используют виртуальную и основную память и загружают кэш. Необходимо минимизировать число исполняемых процессов на машине в момент профилирования программы. Других счетных процессов и процессов, выделяющих много памяти, не должно быть в системе.
Некоторые системные фоновые процессы устранить нельзя, они вносят искажения в измерения.
В современных ОС существует механизм отложенной записи на диск. Рекомендуется очистить буфер записи перед запуском исследуемой программы для уменьшения влияния предыстории. В ОС Linux для этого используется команда sync . Ее также можно выполнить прямо в программе на Си:
Измерить время выполнения алгоритма?
Подскажите, плиз, как замерить время выполнения алгоритма на Си под Linux?
На текущий момент, использую библиотеку time.h
Но если операций слишком мало, всегда на выходе получаю 0.
Хотелось бы что-нибудь поточнее, как например, в Java System.nanoTime().
- Вопрос задан более трёх лет назад
- 6756 просмотров
- Вконтакте
Т.е. сценарий замера такой:
1. Снимаем показание счетчика.
2. Выполняем алгоритм.
3. Снимаем показание счетчика.
4. Из второго значения счетчика вычитаем первое значение — время выполнения алгоритма измеренное в процессорных тактах.
Правильно?
Если да, тогда вопрос, а как мы можем узнать «не отвлекался» ли процессор на выполнение задач отличных от выполнения измеряемого алгоритма?
И вообще:
> Могу написать статью, как мерить небольшие куски си-кода без всякой погрешности.
Было бы здорово!
Похожие публикации:
- Mipi dsi что это
- Как разрезать файл с помощью cue
- Какие программы написаны на с
- Как в case задать диапазон
Источник: amdy.su