GetTickCOunt
как померить время выполнения участка кода С++? компилю GCC из под dev-cpp на винде...GetPerformanceInfo посмотри
uses windows;
var start,stop:cardinal;
begin
start := GetTickCount;
// измеряемый код
stop := GetTickCount;
Writeln(stop-start);
end.
в сях должно имхо быть так, но могу ошибаться
#include "windows.h"
unsigned int start,stop;
start = GetTickCount;
// измеряемый код
stop = GetTickCount;
?
PROFIT!
помоголо
Это ты меряешь время "по часам", а не процессорное. Не всегда объективная мера.
кроме того, речь шла именно о времени выполнения, а не о процессорном.
в любом случае в рукаве есть еще rdtsc на самый крайний случай =)
в любом случае в рукаве есть еще rdtsc на самый крайний случай =)не следует использовать эту инструкцию: на разных ядрах/процах значения счётчика может отличаться и если за время выполнения поток перескочит на другое ядро, получится фигня. На счёт GetTickCount не помню.
да блин, на многоядрах даж не знаю, забыл как-то
#include <Windows.h>у меня выводит:
unsigned __int64 Ticks
{
__asm rdtsc;
}
#define CheckTicks(var,tickfunc,affinity) \
SetThreadAffinityMask(thr, affinity); \
Sleep(10); \
/*for(i=0; i<0xfffffff; i++) var*=i;*/\
var = tickfunc
#define TestABC(tickfunc, primaryaffinity) \
thr = GetCurrentThread; \
CheckTicks(a, tickfunc, primaryaffinity); \
CheckTicks(b, tickfunc, (3-primaryaffinity; \
CheckTicks(c, tickfunc, primaryaffinity); \
printf("%lu %lu %lu\n", a, b, c)
int main
{
unsigned __int64 a, b, c;
HANDLE thr;
//DWORD i;
TestABC(GetTickCount, 1);
TestABC(GetTickCount, 2);
TestABC(Ticks, 1);
TestABC(Ticks, 2);
}
165884953 0 165884968
165884984 0 165885000
1638146082 70496 1657802466
1700664296 70496 1720303982
Система - Core Duo T2400, WinXPHSp3, компилятор - Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
Странно...
Lineage из-за какой-то такой фигни не запускается на многоядерных атлонах, дрова или патч, не помню, с сайта производителя решают.
а что этот патч делает - хз.
получится фигнявплоть до отрицательного времени, афаик
А фигли, не надо __int64 по формату %lu выводить.
GetTickCount слишком неточный.
А фигли, не надо __int64 по формату %lu выводить.пристыдили Заменил на %I64u. А потом ещё поэкспериментировал.
Резюме такое: на моей системе, результат выполнения rdtsc, делённый на частоту проца в килогерцах на ~5 минут отличается от GetTickCount (который возвращает результат в милисекундах). Если запустить два потока на разных ядрах и считать примерно одновременно (синхронизация по event'у, приоритеты у потоков и приложения максимальные) rdtsc, то разница обычно порядка 2000 тиков (примерно столько выполняется Sleep(0 так что в данном случае невозможно рассчитать разницу между счётчиками ядер).
Ещё GetTickCount иногда странно себя ведёт: не изменяется после Sleep(10).
Макросы!
QueryPerformanceCounter и QueryPerformanceFrequency.да-да-да. И не столько в неточности дело, сколько в адекватности.
GetTickCount слишком неточный.
Макросы! :shocking:да, потому-что у rdtsc и GetTickCount разный тип возвращаемого значения, а нормальное решение займёт больше места, что для такой мелкой прожки нецелесообразно.
у rdtsc и GetTickCount разный тип возвращаемого значенияGetTickCount64 или я туплю?
ну да ладно, это не важно..
Ещё GetTickCount иногда странно себя ведёт: не изменяется после Sleep(10).Насколько я помню, его результаты кратны кванту времени выполнения потока, т.е. на ХР порядка 15 миллисекунд. Т.е. если что-то выполняется 5 мс, разница в его показаниях может быть 0, а может быть 15. Об этой неточности я и говорил.
GetTickCount64 или я туплю?
Client
Requires Windows Vista.
Server
Requires Windows Server 2008.
Насколько я помню, его результаты кратны кванту времени выполнения потока, т.е. на ХР порядка 15 миллисекунд. Т.е. если что-то выполняется 5 мс, разница в его показаниях может быть 0, а может быть 15. Об этой неточности я и говорил.то-то я думаю, что разница между двумя вызовами всегда либо 0, либо 15, либо 16мс.
ClientРеально, в MSDN так написано. Готов поклясться, что читал об этой функции в книжке Рихтера издания 2001 года. Завтра проверю =)
Requires Windows Vista.
Server
Requires Windows Server 2008.
Оставить комментарий
356ft85
как померить время выполнения участка кода С++? компилю GCC из под dev-cpp на винде...