GetTickCOunt

356ft85

как померить время выполнения участка кода С++? компилю GCC из под dev-cpp на винде...

Serab

как померить время выполнения участка кода С++? компилю GCC из под dev-cpp на винде...
GetPerformanceInfo посмотри

elenangel

в Delphi обычно использую
 
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!

356ft85

помоголо

Serab

Это ты меряешь время "по часам", а не процессорное. Не всегда объективная мера.

elenangel

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

Andbar

в любом случае в рукаве есть еще rdtsc на самый крайний случай =)
не следует использовать эту инструкцию: на разных ядрах/процах значения счётчика может отличаться и если за время выполнения поток перескочит на другое ядро, получится фигня. На счёт GetTickCount не помню.

elenangel

да блин, на многоядрах даж не знаю, забыл как-то

Andbar

#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
Странно...

elenangel

знаю что нельзя.
Lineage из-за какой-то такой фигни не запускается на многоядерных атлонах, дрова или патч, не помню, с сайта производителя решают.
а что этот патч делает - хз.

Serab

получится фигня
вплоть до отрицательного времени, афаик

procenkotanya

А фигли, не надо __int64 по формату %lu выводить.

karkar

QueryPerformanceCounter и QueryPerformanceFrequency.
GetTickCount слишком неточный.

Andbar

А фигли, не надо __int64 по формату %lu выводить.
пристыдили Заменил на %I64u. А потом ещё поэкспериментировал.
Резюме такое: на моей системе, результат выполнения rdtsc, делённый на частоту проца в килогерцах на ~5 минут отличается от GetTickCount (который возвращает результат в милисекундах). Если запустить два потока на разных ядрах и считать примерно одновременно (синхронизация по event'у, приоритеты у потоков и приложения максимальные) rdtsc, то разница обычно порядка 2000 тиков (примерно столько выполняется Sleep(0 так что в данном случае невозможно рассчитать разницу между счётчиками ядер).
Ещё GetTickCount иногда странно себя ведёт: не изменяется после Sleep(10).

okunek

Макросы! :shocking:

Serab

QueryPerformanceCounter и QueryPerformanceFrequency.
GetTickCount слишком неточный.
да-да-да. И не столько в неточности дело, сколько в адекватности.

Andbar

Макросы! :shocking:
да, потому-что у rdtsc и GetTickCount разный тип возвращаемого значения, а нормальное решение займёт больше места, что для такой мелкой прожки нецелесообразно.

Serab

у rdtsc и GetTickCount разный тип возвращаемого значения
GetTickCount64 или я туплю?

okunek

шаблоны, приведение накрайняк...
ну да ладно, это не важно..

karkar

Ещё GetTickCount иногда странно себя ведёт: не изменяется после Sleep(10).
Насколько я помню, его результаты кратны кванту времени выполнения потока, т.е. на ХР порядка 15 миллисекунд. Т.е. если что-то выполняется 5 мс, разница в его показаниях может быть 0, а может быть 15. Об этой неточности я и говорил.

Andbar

GetTickCount64 или я туплю?
Client
Requires Windows Vista.
Server
Requires Windows Server 2008.

Andbar

Насколько я помню, его результаты кратны кванту времени выполнения потока, т.е. на ХР порядка 15 миллисекунд. Т.е. если что-то выполняется 5 мс, разница в его показаниях может быть 0, а может быть 15. Об этой неточности я и говорил.
то-то я думаю, что разница между двумя вызовами всегда либо 0, либо 15, либо 16мс.

Serab

Client
Requires Windows Vista.
Server
Requires Windows Server 2008.
Реально, в MSDN так написано. Готов поклясться, что читал об этой функции в книжке Рихтера издания 2001 года. Завтра проверю =)
Оставить комментарий
Имя или ник:
Комментарий: