Всем привет, вообщем такая проблема..нужно замерять время работы программы..использую я в своей программе такой метод: //запониниаем в начале программы time_t start_t,end_t; start_t = time(NULL); //в конце программы вычитаем разницу начального и конечного времени и выводим end_t = time(NULL); cout<<end_t-start_t<<"sec\n"; Все проблема в том, что этот метод возвращает время в секундах, а мне нужно в милисекундах. Кто то знает подобный метод?
Код (Text): ;============================================================================ .686 .model flat,stdcall option casemap:none ;============================================================================ include \masm32\include\windows.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib ;============================================================================ .data ; выровнено на 4096 ; В А Ш И Д А Н Н Ы Е ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ iter equ 3 ; кол-во проходов testing: ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ tics dq 0 ; overhead dd 0 ; counter dd 0 ; resultlist dq iter dup(0) ; templist db iter*10+2 dup(0) ; "технические данные" message db iter*26+1 dup(0) ; caption db 64 dup(0) ; lpfmtm db '%.8X%.8X%.8X',13,10,0 ; lpfmtc db '%0.8X / %u bytes / %u passes',0 ;============================================================================ .code ;============================================================================ start: ; invoke GetCurrentProcess ; invoke SetPriorityClass,eax,REALTIME_PRIORITY_CLASS ; invoke GetCurrentThread ; invoke SetThreadPriority,eax,THREAD_PRIORITY_TIME_CRITICAL ;============================================================================ mov ebp,5 ; align 16 ; @@: mov eax,0 ; cpuid ; rdtsc ; mov dword ptr tics,eax ; подсчет overhead mov dword ptr tics+4,edx ; (используется для вычета xor eax,eax ; тактов, ушедших на cpuid ; "технические" детали) xor eax,eax ; cpuid ; rdtsc ; sub eax,dword ptr tics ; mov overhead,eax ; dec ebp ; jnz @B ; align 16 ;============================================================================ testloop: ; используйте esi edi ebp И Н И Ц И А Л И З А Ц И Я ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;mov ebp,1 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ align 16 ; testloop - цикл проходов (итераций) ;============================================================================ rept 8 nop ; для выравнивания testing: endm mov eax,0 cpuid rdtsc mov dword ptr tics,eax mov dword ptr tics+4,edx xor eax,eax cpuid ; eax ecx edx ebx не сохраняется ;============================================================================ testing: ; выровнено на 16 ; Т Е С Т И Р У Е М Ы Е И Н С Т Р У К Ц И И ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ @@: ; тело тестируемого цикла ;============================================================================ Congratulation: ;============================================================================ ; dec ebp ; jnz @b ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; К О Н Е Ц И Н С Т Р У К Ц И Й ;============================================================================ testsize: xor eax,eax ; eax ecx edx ebx не сохраняется cpuid rdtsc mov ebx,dword ptr counter mov dword ptr resultlist[ebx],eax mov dword ptr resultlist[ebx+4],edx mov eax,dword ptr tics mov edx,dword ptr tics+4 add eax,dword ptr overhead adc edx,0 sub dword ptr resultlist[ebx],eax sbb dword ptr resultlist[ebx+4],edx add ebx,8 mov dword ptr counter,ebx cmp ebx,iter * 8 jb testloop ;============================================================================ ; вывод результатов ;============================================================================ ; invoke GetCurrentThread ; invoke SetThreadPriority,eax,THREAD_PRIORITY_NORMAL ; invoke GetCurrentProcess ; invoke SetPriorityClass,eax,NORMAL_PRIORITY_CLASS ;============================================================================ finit mov esi,offset resultlist mov ebp,offset templist mov edi,offset message align 4 @@: fild qword ptr [esi] fabs fbstp tbyte ptr [ebp] invoke wsprintf,edi,addr lpfmtm,dword ptr [ebp+8],\ dword ptr [ebp+4],dword ptr [ebp] add esi,8 add ebp,10 add edi,eax sub dword ptr counter,8 jnz @B mov eax,testsize sub eax,testing invoke wsprintf,addr caption,addr lpfmtc,testing,eax,iter invoke MessageBox,0,addr message,addr caption,MB_ICONINFORMATION finit invoke ExitProcess,0 end start ;============================================================================
http://www.google.com/search?hl=en&q=msdn%20GetTickCount Даёт милисекунды, но неточен при замерах в десятки ms. поэтому либо меряй что-то что занимает секунды (цикл), либо вот: http://www.google.com/search?hl=en&q=QueryPerformanceCounter+msdn
Если извратиться немного с timeBeginPeriod/timeEndPeriod можно добиться относительной точности на десятки и даже единицы ms с GetTickCount, но QueryPerformanceCounter всё же будет по лучше в этом плане.