Thread View: pl.comp.lang.asm
7 messages
7 total messages
Started by KrisB
Sun, 08 May 2011 21:22
Skąd dokładny zegar w C pod Win XP/7 ?
Author: KrisB
Date: Sun, 08 May 2011 21:22
Date: Sun, 08 May 2011 21:22
6 lines
1183 bytes
1183 bytes
Potrzebuję zrobić porównanie czasu wykonania algorytmów pod Visual C++ i Win XP/7. Funkcja C time( time_t) z rozdzielczością do milisekund mi nie wystarcza-potrzebuję rozdzielczości gdzieś do mikrosekund. (może być wstawka asm) Krzyś
Re: Skąd dokładny zegar w C pod Win XP/7 ?
Author: Borneq
Date: Sun, 08 May 2011 22:02
Date: Sun, 08 May 2011 22:02
9 lines
1270 bytes
1270 bytes
W dniu 2011-05-08 23:22, KrisB pisze: > Potrzebuję zrobić porównanie czasu wykonania algorytmów pod Visual C++ i > Win XP/7. > > Funkcja C time( time_t) z rozdzielczością do milisekund mi nie > wystarcza-potrzebuję rozdzielczości gdzieś do mikrosekund. (może być > wstawka asm) > > Krzyś
Re: Skąd dokładny zegar w C pod Win XP/7 ?
Author: Borneq
Date: Sun, 08 May 2011 22:09
Date: Sun, 08 May 2011 22:09
33 lines
2189 bytes
2189 bytes
W dniu 2011-05-08 23:22, KrisB pisze:
> Potrzebuję zrobić porównanie czasu wykonania algorytmów pod Visual C++ i
> Win XP/7.
>
> Funkcja C time( time_t) z rozdzielczością do milisekund mi nie
> wystarcza-potrzebuję rozdzielczości gdzieś do mikrosekund. (może być
> wstawka asm)
QueryPerformanceCounter chodzi z częstotliwością około 3 MHz ale lepiej
odczytać tę częstotliwość za pomocą QueryPerformanceFrequency.
Jeśli by to nie wystarczyło można użyć wstawki assemblerowej RDTSC która
mierzy pojedyncze takty CPU (!) i jej wywołanie trwa bardzo krótko.
Należy jednak pamiętać że na wielordzeniowych procesorach (wielu
procesorach) głupio się zachowuje, bo każdy rdzeń ma swój własny
taktomierz, które się rozjeżdzają. Aby więc zmierzyć wątek/proces
nn rekord typu 64 bitowego
_asm{
dw 310Fh // rdtsc
mov nn.Lo, eax
mov nn.Hi, edx
}
proceura do mierzenia
_asm
{
dw 310Fh // rdtsc
sub eax, nn.Lo
sbb edx, nn.Hi
mov nn.Lo, eax
mov nn.Hi, edx
}
należy ustawić aby był wykonywany tylko przez jeden rdzeń:
SetProcessAffinityMask(GetCurrentProcess(), 1);
inaczej ma się dziwne wyniki.
Re: Skąd dokładny zegar w C pod Win XP/7 ?
Author: Borneq
Date: Sun, 08 May 2011 22:13
Date: Sun, 08 May 2011 22:13
9 lines
1273 bytes
1273 bytes
W dniu 2011-05-09 00:09, Borneq pisze:
> dw 310Fh // rdtsc
Kod wzięty z programu w Pascalu, który miał działać na bardzo starych
kompilatorach, gdzie nie było rdtsc, w nowym C powinna być ta instrukcja
n: liczba 64 bitowa
rdtsc
mov nn, eax
mov nn[4], edx
Re: Skąd dokładny zegar w C pod Win XP/7 ?
Author: Wiktor S.
Date: Mon, 09 May 2011 05:41
Date: Mon, 09 May 2011 05:41
13 lines
1405 bytes
1405 bytes
> Potrzebuję zrobić porównanie czasu wykonania algorytmów pod Visual > C++ i Win XP/7. > Funkcja C time( time_t) z rozdzielczością do milisekund mi nie > wystarcza-potrzebuję rozdzielczości gdzieś do mikrosekund. (może być > wstawka asm) Żaden timer o takiej ROZDZIELCZOŚCI nie zapewni ci takiej DOKŁADNOŚCI. Przy mierzeniu algorytmów mierzy się cas tysiąca, miliona, miliarda iteracji, aby mierzone czasy były rzędu sekund, a nie mikrosekund. -- Azarien
Re: Skąd dokładny zegar w C pod Win XP/7 ?
Author: KrisB
Date: Mon, 09 May 2011 07:43
Date: Mon, 09 May 2011 07:43
19 lines
2320 bytes
2320 bytes
Użytkownik "Wiktor S." <wswiktorSP@Mpoczta.fm> napisał w wiadomości news:iq7uqe$bj5$1@news.onet.pl... >> Potrzebuję zrobić porównanie czasu wykonania algorytmów pod Visual >> C++ i Win XP/7. >> Funkcja C time( time_t) z rozdzielczością do milisekund mi nie >> wystarcza-potrzebuję rozdzielczości gdzieś do mikrosekund. (może być >> wstawka asm) > > Żaden timer o takiej ROZDZIELCZOŚCI nie zapewni ci takiej DOKŁADNOŚCI. > Przy mierzeniu algorytmów mierzy się cas tysiąca, miliona, miliarda iteracji, aby mierzone czasy były rzędu sekund, a nie > mikrosekund. 1) Mam algorytm który będzie wykonywany dla danych rozmiaru max ~naście. Wykona się to w czasie max kilku msek. 2) Co do tych "tysięcy" prób: a jak "odfiltrować" koszty samej obsługi tych tysięcy prób ? Wywołanie / obsługa pętli / niemiarodajna zawartość cache tj. na ogół większość danych przy powtarzających się wywołaniach już będzie w cache.. PS. Jak pod Win XP/7 uczynić taki pomiar obiektywny ? Jak i jakie usługi wyłączyć ? Mogę wyłączyć firewall, antywirusa, wszystkie możliwe procesy w msconfig, odłączę kom od sieci, ale to raczej mało. Jak zrobić żeby win na czas pomiarów nie robił NIC dodatkowego a przynajmniej jak najmniej ??? (Na pewno rozumiecie)
Re: Skąd dokładny zegar w C pod Win XP/7 ?
Author: Borneq
Date: Mon, 09 May 2011 08:27
Date: Mon, 09 May 2011 08:27
27 lines
2292 bytes
2292 bytes
W dniu 2011-05-09 09:43, KrisB pisze:
> PS. Jak pod Win XP/7 uczynić taki pomiar obiektywny ? Jak i jakie usługi
> wyłączyć ? Mogę wyłączyć firewall, antywirusa, wszystkie możliwe procesy
> w msconfig, odłączę kom od sieci, ale to raczej mało. Jak zrobić żeby
> win na czas pomiarów nie robił NIC dodatkowego a przynajmniej jak
> najmniej ??? (Na pewno rozumiecie)
Jak nic nie będzie chodziło to nie powinien czas się zbytnio
dłużyć.Można zwiększyć priorytet testowanego programu i wątku :
PriorityClass = GetPriorityClass(GetCurrentProcess);
Priority = GetThreadPriority(GetCurrentThread);
try
{
SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS);
SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_TIME_CRITICAL);
...testowanie...
}
finally
{
SetThreadPriority(GetCurrentThread, Priority);
SetPriorityClass(GetCurrentProcess, PriorityClass);
}
Pamiętając o przywróceniu w finally. Można też wykonać algorytm kilka
razy i uznać za prawdziwy ten czas, który jest najmniejszy - zwykle
większość będzie podobna do najmniejszego i raz na jakiś czas będzie
dłużej - zdarza się to gdy pętla wykonywana jest dłużej, gdzie może się
przytrafić już przerwanie zegarowe.
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads