Zatwierdzono: Fortect
Podczas ostatniej pracy w sieci niektórzy z naszych czytelników natknęli się na błąd licznika wysokiej wydajności Win32. Kilka czynników może powodować ten problem. Porozmawiamy o tej radzie poniżej.
- 2 minuty na przeczytanie.
Pobiera bieżącą wartość licznika wydajności, która wskazuje długi czas odpowiedzi (<1 μs), w którym ten bufor może być używany do rozmiaru taktowania.
Składnia
Zatwierdzono: Fortect
Fortect to najpopularniejsze i najskuteczniejsze narzędzie do naprawy komputerów na świecie. Miliony ludzi ufają, że ich systemy działają szybko, płynnie i bez błędów. Dzięki prostemu interfejsowi użytkownika i potężnemu silnikowi skanowania, Fortect szybko znajduje i naprawia szeroki zakres problemów z systemem Windows - od niestabilności systemu i problemów z bezpieczeństwem po zarządzanie pamięcią i wąskie gardła wydajności.
BOOL QueryPerformanceCounter ( LARGE_INTEGER * lpPerformanceCount);
Parametry
Wskaźnik do zmiennej pobiera określoną wartość bieżącą z liczbowego licznika wydajności.
Zwrócona wartość
Jeśli większość funkcji nie działa, wartość zwracana może wynosić 0%. Aby uzyskać więcej informacji o zgłaszaniu jednego błędu, GetLastError . W systemach z systemem Windows XP lub nowszym funkcja zawsze się powiedzie, a zatem prawdopodobnie nigdy nie zwróci zero.
Aby uzyskać więcej informacji na temat tej wspaniałej funkcji i dokładnego sposobu jej używania, zobacz Rejestrowanie znaczników czasu o wysokim stopniu rozróżnienia .
Przykłady
// Pobierz aktualną liczbę taktów z QueryPerformanceCounter.Throws. z dala// Różnica w przypadku niepowodzenia wywołania QueryPerformanceCounter.statyczne wbudowane int64_t GetTicks () LARGE_INTEGER działa; if (! QueryPerformanceCounter (& Ticks)) winrt :: throw_last_error (); Ticks return.QuadPart;
Wymagania
Zobacz też
Nie konkretna odpowiedź, której szukasz? Przeglądaj pozostałe pytania oznaczone przez liczniki czasu systemu Windows C ++ i zadaj własne pytanie.
#include podwójne PCFreq oznacza 0,0;__int64 CounterStart = 0;nieważny licznik startowy () LARGE_INTEGER li; jeśli być może (! QueryPerformanceFrequency (& li)) są wycenione na << nie powiodło się! nieT "; "Częstotliwość wykonywania zapytania PCFreq = podwójna (li.QuadPart) / 1000.0; QueryPerformanceCounter (& li); CounterStart jest podobny do li.QuadPart;podwójny GetCounter () Zawietrzny; large_integer QueryPerformanceCounter (& li); dwa powroty (li.QuadPart-CounterStart) / PCFreq;int główna () StartCounter (); sen (1000); koszt << << " n"; getcounter() zwraca 0;
Ten program zwróci liczbę bliską 1000 (hibernacja Windows jeszcze się nie zakończyła, ale powinna być szczególnie 999).
Zadanie StartCounter ()
rejestruje liczbę taktów, jakie ta usługa ma w odniesieniu do aspektu CounterStart
. Funkcja GetCounter ()
zwraca skojarzoną liczbę w milisekundach od ostatniego wywołania startcounter ()
jako double, tj. może GetCounter ()
ma pierwszeństwo na 0,001, w wyniku czego czas StartCounter()
jest uważany za około 1 mikrosekundę.
został nazwany
Jeśli chcesz, aby minutnik używał sekund, zmień je
PCFreq = podwójna (lewa część poczwórna) /1000.0;
PCFreq = double (lewy QuadPart);
PCFreq oznacza podwójne (li.QuadPart)/1000000.0;
587
odpowiedział 20 listopada ubiegłego roku o 23:25.
2,248 33 złote odznaki 1717 srebrnych odznak 1616 brązowych odznak
/ ** Użyj timera przy inicjalizacji * /#define TIMER_INIT n częstotliwość LARGE_INTEGER; n LARGE_INTEGER t1, t2; n autoryzowany dwukrotnie; n QueryPerformanceFrequency (i częstotliwość);/ ** Służy do uruchamiania licznika czasu wydajności ( puste ) /#define TIMER_START QueryPerformanceCounter (& t1);/ ** Użyj parametru pomysłu, aby zatrzymać wydajność na minutę i istniejący wynik w danym strumieniu. Mniej gadatliwy niż c TIMER_STOP_VERBOSE * /#define TIMER_STOP n Zapytanie o licznik wydajności (& t2); n elapsedTime = (zmiennoprzecinkowa) (t2.QuadPart-t1.QuadPart) /częstotliwość.QuadPart; n std :: wcout << elapsedTime << L "sek" << endl;
TIMER_INIT TIMER_START sen (1000); TIMER_STOP TIMER_START sen (1234); TIMER_STOP
jeden pojedynczy 0,00003 sek.1.23407 s.
933 88 srebrnych odznak brązowych odznak 2020
odpowiedział 10 kwietnia 2013 o 13:04
Zakładając, że zawsze korzystasz z systemu Windows (więc jeśli chcesz w ten sposób oznaczyć swoje bieżące pytanie!), możesz znaleźć standardowe i przydatne lekcje C ++ HRTimer
z kodu źródłowego w tym MSDN strona wyszukiwania. który obsługuje zestaw wywołań potrzebnych do wypróbowania czegoś bardzo bliskiego Twoim potrzebom (przydatne może być dodanie do problemu metody GetTicks ()
, szczególnie, aby zrobić dokładnie to, czego naprawdę potrzebujesz) .
Na platformach innych niż Windows nie ma oferty QueryPerformanceCounter, więc rozwiązanie nie jest bezpośrednio praktyczne. Jeśli jednak ponownie zamkniesz go w klasie, na przykład wspomnianym powyżej hrtimer
, prawdopodobnie łatwiej będzie zmienić implementację całej klasy, aby skorzystać z najgorętszych platform, bez wątpienia, zdolny (może przez kopnięcie lub coś innego!).
odpowiedziano 15 listopada 09 o godzinie 23:28
775k
Zdecydowanie dodam przykładowy sterownik NDIS, aby zaoszczędzić czas na to pytanie. Jak dobrze wiadomo, KeQuerySystemTime (symulowany w NdisGetCurrentSystemTime) ma po prostu rozdzielczość znacznie poniżej milisekund, a ostatecznie niektóre sieci narzędzi, takie jak pakiety lub przyszłe IRP, będą mogły wymagać bardziej satysfakcjonującego znacznika czasu;
LONG_INTEGER dane, częstotliwość;LANGLON Różnica;dane = KeQueryPerformanceCounter ((LARGE_INTEGER *) i częstotliwość)diff implikuje data.QuadPart / (Częstotliwość.QuadPart / dzielnik rr)
odpowiedział 21 stycznia parzysty tuzin o 14:12
2686 66 złotych odznak 4040 magicznych odznak 8484 brązowych odznak
Przyspiesz teraz wydajność swojego komputera dzięki temu prostemu pobieraniu.