Как посчитать время выполнения программы c в миллисекундах

Добрый день!
Есть фрагмент когда. Нужно посчитать в миллисекундах время его выполнения. В поиске по этому форуму — не нашел.

Тестирую в VS2005.
Подключаю #include юзаю GetTickCount() — она выдает всегда одинаковое значения для ДО и ПОСЛЕ моего фрагмента.
Хотя в качестве эксперимента я задавал в этом фрагменте цикл и в 50000 проходов и в 5000000

#include #include #include using namespace std; int main() < DWORD time1 = ::GetTickCount(); int i = 5000000; while (i—) < int b = 3 DWORD time2 = ::GetTickCount() — time1; cout

Что-то делаю не так?
Как нужно считать время в c++ с точностью до миллисекунд. (а до микросекунд?)

Re: как посчитать время выполнения в миллисекундах?

От: Павел Кузнецов
Дата: 05.02.06 06:16
Оценка:

ddocker,

> Подключаю #include юзаю GetTickCount() — она выдает всегда одинаковое значения для ДО и ПОСЛЕ моего фрагмента.

Время в C++


> Хотя в качестве эксперимента я задавал в этом фрагменте цикл и в 50000 проходов и в 5000000
>

> DWORD time1 = ::GetTickCount(); > int i = 5000000; > while (i—) < >int b = 3 > > DWORD time2 = ::GetTickCount() — time1; >

Наверняка, оптимизатор выбрасывает этот цикл. Попробуй «воткнуть» в него вызов функции, определенной в другом файле.

> Как нужно считать время в c++ с точностью до миллисекунд. (а до микросекунд?)

Posted via RSDN NNTP Server 2.0
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[2]: как посчитать время выполнения в миллисекундах?

От: ddocker www.codelab.ru
Дата: 05.02.06 06:42
Оценка:

Здравствуйте, Павел Кузнецов, Вы писали:

ПК>ddocker,

ПК>Наверняка, оптимизатор выбрасывает этот цикл. Попробуй «воткнуть» в него вызов функции, определенной в другом файле.
Так что же, проанализировать время выполнения функции, объявленной в этом же файле — нельзя?
Нужно будет обязательно вынести ее в другой файл, чтобы оптимизатор ее не свернул?

ПК>QueryPerformanceCounter, rdtsc
спасибо, буду копать,

Re[3]: как посчитать время выполнения в миллисекундах?

От: Павел Кузнецов
Дата: 05.02.06 07:08
Оценка:

ddocker,

> Так что же, проанализировать время выполнения функции, объявленной в этом же файле — нельзя?
> Нужно будет обязательно вынести ее в другой файл, чтобы оптимизатор ее не свернул?

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

Ответы на вопросы 3: Замер времени исполнения программы.

Posted via RSDN NNTP Server 2.0
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re: как посчитать время выполнения в миллисекундах?

От: _Winnie C++.freerun
Дата: 06.02.06 00:57
Оценка:

Мерять можно только что-то большое и осмысленное. Мерять скорость сложения двух чисел невозможно, в процессоре вообще нет такого понятия.

Правильно работающая программа — просто частный случай Undefined Behavior
Re: как посчитать время выполнения в миллисекундах?

От: ilyxan
Дата: 06.02.06 02:09
Оценка:

Здравствуйте, ddocker, Вы писали:

D>Что-то делаю не так?
Всё то так, но округление и точность у GetTickCount() оставляет желать лучшего

. __declspec(naked) unsigned __int64 rdtsc(void) < __asm rdtsc; __asm retn; > int main() < unsigned __int64 tacts1 = rdtsc(); . unsigned __int64 tacts2 = rdtsc() — tacts1; . >

Читайте также:
Что такое блокнот программа

rdtsc возвращает количество тактов с момента последнего сброса процессора. Посчитай сколько у тебя тактов за определённое время проходит и по пропорции найди сколько мили микро нано секунд у тебя кушает твой цикл.
Смотри, как бы у тебя в релизе компилятор не выкинул твой цикл.
Поиском по форумам выдаст очень много ссылок и дополнительной информации.
Да и вообще профайлеры очень помогают VTune в помощь.

Re: как посчитать время выполнения в миллисекундах?

От: ien
Дата: 06.02.06 03:05
Оценка:

Здравствуйте, ddocker, Вы писали:

D>Как нужно считать время в c++ с точностью до миллисекунд.
Хм. Если знаешь асм.
1. Выясни какой код на асме, вызывает эту процедуру, и сохраняетвычитает переменные.
(это несложно, учитывая то, какую помощь оказали в этом создатели IDE)
2. Окружи фрагмент вставками с соответсвцющим кодом.

Вставку компилятор не посмеет выкинуть.
Кстати, при точных измерениях учитывай скорость вызова GetTickCount();

Re: как посчитать время выполнения в миллисекундах?

От: _JoKe_
Дата: 06.02.06 09:52
Оценка:

Здравствуйте, ddocker, Вы писали:
D>

D>#include D>#include D>#include D>using namespace std; D>int main() D> < D>DWORD time1 = ::GetTickCount(); D> int i = 5000000; D> while (i—) < D>int b = 3 > D> DWORD time2 = ::GetTickCount() — time1; D> cout cout > D>

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

Re: как посчитать время выполнения в миллисекундах?

От: ecco
Дата: 06.02.06 11:54
Оценка:

Здравствуйте, ddocker, Вы писали:

D>Добрый день!
D>Есть фрагмент когда. Нужно посчитать в миллисекундах время его выполнения. В поиске по этому форуму — не нашел.
D>Как нужно считать время в c++ с точностью до миллисекунд.
Я считаю этим, довольно удобная штукенция:

timeBeginPeriod() timeGetTime() timeEndPeriod()

D>(а до микросекунд?)
Имхо точно измерить микросекунды времени выполнения команд не получится, только примерно, с помощью асма.

Re: как посчитать время выполнения в миллисекундах?

От: ddocker www.codelab.ru
Дата: 06.02.06 23:32
Оценка:

Спасибо всем за советы.
Реализовал такой простенький класс подсчета:
timer.h

#pragma once #include class Timer < private: unsigned __int64* counters; unsigned __int64 freq; public: Timer(int = 1); void Start(int = 0); float Get(int = 0); public: ~Timer(void); >;
#include «Timer.h» Timer::Timer(int n) < this->counters = new unsigned __int64[n]; QueryPerformanceFrequency((LARGE_INTEGER*) > void Timer::Start(int counter) < QueryPerformanceCounter((LARGE_INTEGER*)counters[counter]); > float Timer::Get(int counter) < unsigned __int64 end; QueryPerformanceCounter((LARGE_INTEGER*) return (float(end — this->counters[counter]) / freq); > Timer::~Timer(void) < delete [] this->counters; >

В программе примерно так:

. Timer timerObj(3); timerObj.Start(0); [. some code. ] timerObj.Start(1); [. some code. ] printf(«counter1: %fn», timerObj.Get(1)); timerObj.Start(2); [. some code. ] printf(«counter2: %fn», timerObj.Get(2)); [. some code. ] printf(«counter0: %fn», timerObj.Get(0));

Нормально?
Небольшие искажения из-за обращений к методам объектов и проч. — для меня не имеют значения если?

Re[2]: как посчитать время выполнения в миллисекундах?

От: bolshik http://denis-zhdanov.blogspot.com/
Дата: 07.02.06 07:30
Оценка: -1

Здравствуйте, ddocker, Вы писали:

D>

D>#include «Timer.h» D>Timer::Timer(int n) D>< this->>counters = new unsigned __int64[n]; D> QueryPerformanceFrequency((LARGE_INTEGER*) D>> D>void Timer::Start(int counter) < D>QueryPerformanceCounter((LARGE_INTEGER*)counters[counter]); D>> D>float Timer::Get(int counter) < D>unsigned __int64 end; D> QueryPerformanceCounter((LARGE_INTEGER*) D> return (float(end — this->counters[counter]) / freq); D>> D>Timer::~Timer(void) D> < D>delete [] this->counters; D>> D>

Читайте также:
В чем заключается суть программы живые системы

D>Нормально?
D>Небольшие искажения из-за обращений к методам объектов и проч. — для меня не имеют значения если?

да, только использование this-> излишне(см. выделенные места)

Re[3]: offtop

От: ddocker www.codelab.ru
Дата: 07.02.06 12:06
Оценка:

B> да, только использование this-> излишне(см. выделенные места)

Почему? Так наглядней.. для меня по-крайней мере.
или это влечет за собой какое-нибудь разыменование указателей, ссылок на объект, т.е. к лишним операциям?

Re[4]: offtop

От: ddocker www.codelab.ru
Дата: 07.02.06 12:09
Оценка:

Здравствуйте, ddocker, Вы писали:

B>> да, только использование this-> излишне(см. выделенные места)

D>Почему? Так наглядней.. для меня по-крайней мере.
D>или это влечет за собой какое-нибудь разыменование указателей, ссылок на объект, т.е. к лишним операциям?

Всмысле я хотел сказать, что знаю конечно, что можно из без this, но хотел спросить, не ведет ли обращение через this к каким-нибудь лишним операциям?

Re[5]: offtop

От: Warturtle
Дата: 07.02.06 12:59
Оценка:

Здравствуйте, ddocker, Вы писали:

D>Здравствуйте, ddocker, Вы писали:

B>>> да, только использование this-> излишне(см. выделенные места)

D>>Почему? Так наглядней.. для меня по-крайней мере.
D>>или это влечет за собой какое-нибудь разыменование указателей, ссылок на объект, т.е. к лишним операциям?

D>Всмысле я хотел сказать, что знаю конечно, что можно из без this, но хотел спросить, не ведет ли обращение через this к каким-нибудь лишним операциям?

Не ведет, потому что это одно и то же (this — неявный параметр любого нестатического метода класса и обращения к нестатическим членам в нем происходит через этот константный указатель this).

Источник: www.rsdn.org

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

Привет. Использую функцию GetTickCount() для измерения времени выполнения в миллисекундах, но вот кусок кода:

UINT32 start = GetTickCount(); upper = lower + step; while (upper < n) < result += (double)(upper-lower)/6.0*(func(lower,degree) + 4*func(double(upper+lower)/2,degree) + func(upper,degree)); upper += step; lower += step; >if (upper >= n) < upper = n; result += (double)(upper-lower)/6.0*(func(lower,degree) + 4*func(double(upper+lower)/2,degree) + func(upper,degree)); >UINT32 end = GetTickCount(); UINT32 diff = end — start;

В конце концов получается, что diff = 0. Если в while добавить какой-нибудь вывод (cout), то время наконец-таки замеряется. Так вот вопрос: как можно замерить время выполнения в миллисекундах? Уж больно быстро выполняется программа.

Отслеживать
11 1 1 золотой знак 2 2 серебряных знака 8 8 бронзовых знаков
задан 13 сен 2014 в 19:38
user17711 user17711

А если она у тебя выполняется быстрее одной миллисекунды и выдает правильный результат? P.S. cast в double не обязателен, если делить на константу типа double: (2.0; 4.2; 5.312).

13 сен 2014 в 19:48
Спасибо. Исправлю. Мне просто нужно замерить время выполнения как-нибудь. Все перепробовал.

13 сен 2014 в 19:50

BOOL QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount); возвращает количество системных «тиков». Попробуйте посчитать их, если миллисекунды — слишком большой масштаб.

13 сен 2014 в 20:07
13 сен 2014 в 20:16
13 сен 2014 в 20:56

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Вы никогда не сможете замерить точное время выполнения вашего кода. Многозадачность в Windows — интересная штука, в любой момент времени операционная система может решить переключить контекст выполнения с вашей на другую задачу. И в итоге вы получите не совсем те результаты 🙂 И присуще это не только Windows. В подобных ситуациях обычно поступают следующим образом: замеряют выполнение N повторений требуемого участка, и затем вычисляют среднее время выполнения одного повторения.

Читайте также:
Как получать доход от партнерских программ

Источник: ru.stackoverflow.com

Как я могу узнать время выполнения программы в миллисекундах на C?

В настоящее время я получаю время стены выполнения моей программы в секундах , вызывая:

time_t startTime = time(NULL); //section of code time_t endTime = time(NULL); double duration = difftime(endTime, startTime);

Можно ли узнать время стены в миллисекундах ? Если да, то как?

alex 7 Фев 2010 в 06:12

6 ответов

Лучший ответ

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

struct timeb mt; if (ftime( #ifdef WIN32 /* Windows */ FILETIME ft; LARGE_INTEGER li; uint64 ret; /* Get the amount of 100 nano seconds intervals elapsed since January 1, 1601 (UTC) and copy it * to a LARGE_INTEGER structure. */ GetSystemTimeAsFileTime( li.LowPart = ft.dwLowDateTime; li.HighPart = ft.dwHighDateTime; ret = li.QuadPart; ret -= 116444736000000000LL; /* Convert from file time to UNIX epoch time. */ ret /= 10000; /* From 100 nano seconds (10^-7) to 1 millisecond (10^-3) intervals */ return ret; #else /* Linux */ struct timeval tv; uint64 ret; gettimeofday( ret = tv.tv_usec; /* Convert from micro seconds (10^-6) to milliseconds (10^-3) */ ret /= 1000; /* Adds the seconds (10^0) after converting them to milliseconds (10^-3) */ ret += (tv.tv_sec * 1000); return ret; #endif >

Вы можете изменить его так, чтобы он возвращал микросекунды вместо миллисекунд, если хотите.

Thomas Bonini 7 Фев 2010 в 10:59

Библиотека GLib с открытым исходным кодом имеет систему GTimer, которая утверждает, что обеспечивает точность до микросекунд. Эта библиотека доступна в Mac OS X, Windows и Linux. В настоящее время я использую его для определения времени производительности в Linux, и, похоже, он отлично работает.

Bob Murphy 7 Фев 2010 в 07:28

gprof , который является частью инструментария GNU, является вариантом. В большинстве систем POSIX он будет установлен, и он доступен в Cygwin для Windows. Самостоятельное отслеживание времени с помощью gettimeofday() работает нормально, но по производительности эквивалентно использованию операторов печати для отладки. Это хорошо, если вам просто нужно быстрое и грязное решение, но это не так элегантно, как использование подходящих инструментов.

Чтобы использовать gprof , вы должны указать опцию -pg при компиляции с gcc , как в:

gcc -o prg source.c -pg

Затем вы можете запустить gprof в созданной программе следующим образом:

gprof prg > gprof.out

По умолчанию gprof будет генерировать общее время выполнения вашей программы, а также количество времени, потраченного на каждую функцию, количество раз, когда каждая функция была вызвана, среднее время, затраченное на каждый вызов функции, и аналогичную информацию.

С помощью gprof можно установить большое количество параметров. Если вам интересно, дополнительную информацию можно найти на страницах руководства или через Google.

Swiss 7 Фев 2010 в 11:33

В Windows используйте QueryPerformanceCounter и связанный QueryPerformanceFrequency. Они не дают вам время, которое можно перевести в календарное время, поэтому, если вам это нужно, спросите время с помощью CRT API, а затем немедленно используйте QueryPerformanceCounter. Затем вы можете выполнить простое сложение / вычитание для расчета календарного времени с некоторой ошибкой из-за времени, необходимого для последовательного выполнения API. Эй, это компьютер, чего ты ожидал .

Источник: question-it.com

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