🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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 ?
#2461
Author: KrisB
Date: Sun, 08 May 2011 21:22
6 lines
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 ?
#2462
Author: Borneq
Date: Sun, 08 May 2011 22:02
9 lines
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 ?
#2463
Author: Borneq
Date: Sun, 08 May 2011 22:09
33 lines
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 ?
#2464
Author: Borneq
Date: Sun, 08 May 2011 22:13
9 lines
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 ?
#2465
Author: Wiktor S.
Date: Mon, 09 May 2011 05:41
13 lines
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 ?
#2466
Author: KrisB
Date: Mon, 09 May 2011 07:43
19 lines
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 ?
#2467
Author: Borneq
Date: Mon, 09 May 2011 08:27
27 lines
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