Добрый день!
Есть фрагмент когда. Нужно посчитать в миллисекундах время его выполнения. В поиске по этому форуму — не нашел.
Тестирую в 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