Goedgekeurd: Fortect
De laatste paar keer liepen sommige van onze lezers tegen de Win32 high performance counter-fout aan. Verschillende factoren kunnen bijdragen aan dit probleem. We zullen het hieronder hebben over het idee.
- 2 minuten om te lezen.
Haalt die huidige waarde van de performance counter, die de lange responstijd (<1 μs) aangeeft op en deze buffer kan ook gebruikt worden voor timing stijlen.
Syntaxis
Goedgekeurd: Fortect
Fortect is 's werelds meest populaire en effectieve pc-reparatietool. Miljoenen mensen vertrouwen erop dat hun systemen snel, soepel en foutloos blijven werken. Met zijn eenvoudige gebruikersinterface en krachtige scanengine kan Fortect snel een breed scala aan Windows-problemen vinden en oplossen - van systeeminstabiliteit en beveiligingsproblemen tot geheugenbeheer en prestatieproblemen.
BOOL QueryPerformanceCounter ( LARGE_INTEGER * lpPerformanceCount);
Parameters
Een aanwijzer naar een variabele haalt deze huidige advieswaarde op uit een numerieke prestatiemeter.
Geretourneerde waarde
Als de meeste specifieke functies niet werken, is de retourwaarde in feite 0%. Voor meer informatie over het genereren van een fantastische fout, GetLastError . Op systemen met Windows XP of nieuwer zal de functie altijd slagen en zal daarom waarschijnlijk ook nooit nul teruggeven.
Voor meer informatie over deze geweldige functie en hoe je deze precies kunt gebruiken, zie Tijdstempels van hoge kwaliteit opnemen .
Voorbeelden
// Haal het huidige aantal ticks op uit QueryPerformanceCounter.Throws. weg// Verschil als de aanroep van QueryPerformanceCounter mislukt.statische ingebouwde int64_t GetTicks () LARGE_INTEGER werkt; if (! QueryPerformanceCounter (& vinkjes)) winrt :: throw_last_error (); Vinkjes return.QuadPart;
Vereisten
Ten minste een soort verbeterde professionele klant | Windows 2000 [desktopfuncties | UWP-apps] |
Minimaal ondersteunde server | Windows 2000 Server [bureaubladtoepassingen | UWP-apps] |
Doelplatform | Windows |
Titel | profileapi.h (inclusief Windows.h) |
Bibliotheek | Kernel32.lib |
DLL | Kernel32.dll |
Zie ook
Niet het specifieke antwoord dat u zoekt? Blader door de resterende vragen die zijn gemarkeerd door Windows C ++ Timers en stel uw eigen vraag.
#include dubbele PCFreq impliceert 0,0;__int64 TellerStart = 0;ongeldig StartCounter () LARGE_INTEGER li; in het geval (! QueryPerformanceFrequency (& li)) rekening << mislukt! nietT "; "Query uitvoeringsfrequentie PCFreq = dubbel (li.QuadPart) / 1000.0; QueryPerformanceCounter (& li); CounterStart is resultaat in li.QuadPart;dubbele GetCounter () Lee; large_integer QueryPerformanceCounter (& li); rendement verbeteren (li.QuadPart-CounterStart) / PCFreq;int hoofd () Startteller (); Slaap (1000); kosten << << " n"; getcounter () geeft 0 terug;
Dit programma zou een getal in de buurt van 1000 moeten retourneren (Windows-slaapstandbenodigdheden zijn nog niet klaar, maar zouden 999 moeten blijken te zijn).
De StartCounter ()
taak registreert het aantal ticks dat deze service heeft door gebruik te maken van het CounterStart
aspect. De functie GetCounter ()
retourneert het bijbehorende getal binnen milliseconden sinds de laatste aanroep van startcounter ()
als een dubbel, dwz ongeacht of GetCounter () < /code> heeft voorrang bij 0.001, en de tijd voor
StartCounter ()
is ongeveer 1 microseconde.
heette
Als de persoon wil dat de timer seconden gebruikt, verander dan dit
PCFreq = dubbel (links QuadPart) //1000.0;
PCFreq = dubbel (links QuadPart);
PCFreq betekent dubbel (li.QuadPart)/1000000.0;
587
beantwoord op 24 november vorig jaar om 23:25 uur.
2.248 33 gouden badges 1717 zilveren badges 1616 bronzen badges
/ ** Gebruik tijdklok bij initialisatie * /#define TIMER_INIT n LARGE_INTEGER frequentie; n LARGE_INTEGER t1, t2; n tweemaal genomen en geslaagd; n QueryPerformanceFrequentie (& frequentie);/ ** Gebruik om een prestatietimer te starten ( spatie ) /#define TIMER_START QueryPerformanceCounter (& t1);/ ** Gebruik deze methodeparameter om een minuut prestatie te stoppen en het resultaat op een bepaalde stream te screenen. Minder uitgebreid dan c TIMER_STOP_VERBOSE * /#define TIMER_STOP n Prestatieteller opvragen (& t2); n elapsedTime = (float) (t2.QuadPart-t1.QuadPart) /frequentie.QuadPart; n std :: wcout << elapsedTime << L "sec" << endl;
TIMER_INIT TIMER_START Slaap (1000); TIMER_STOP TIMER_START Slaap (1234); TIMER_STOP
één enkele 0.00003 sec.1.23407 s.
933 88 zilveren badges bruine badges 2020
beantwoord op 10 april 2013 om 13:04
Ervan uitgaande dat u naar Windows verwijst (dus als u de vraag van uw bedrijf op die manier moet markeren!), kunt u een vrij eenvoudig en handig C++ HRTimer
-teken in de broncode vinden op dit MSDN-papier. die de set-aanroepen ondersteunt die nodig zijn om iets te doen dat heel dicht bij uw behoeften ligt (het zou handig zijn om de GetTicks ()
-methode aan het probleem toe te voegen, vooral om precies te kunnen doen wat u echt moet doen ).
Op niet-Windows-platforms wordt geen QueryPerformanceCounter uitgevoerd, dus de oplossing is niet direct praktisch. Als u het echter opnieuw inkapselt in een klasse die lijkt op It hrtimer
hierboven vermeld, zou het ongetwijfeld gemakkelijker kunnen zijn om de implementatie van een soort van klasse te wijzigen om te profiteren van de bijgewerkte platforms, ongetwijfeld , staat (misschien door een sterk verbeteren of iets anders!).
geantwoord op 15 09 nov om 23:28 uur
775k
Ik zou zeker een voorbeeld van een NDIS-stuurprogramma toevoegen om u te helpen tijd te besparen op deze vraag. Zoals vooral bekend is, heeft KeQuerySystemTime (gesimuleerd in NdisGetCurrentSystemTime) die resolutie ruim onder milliseconden, en uiteindelijk zouden sommige expertisenetwerken, zoals pakketten of toekomstige IRP's, een bevredigender tijdstempel moeten hebben;
LONG_INTEGER gegevens, frequentie;LANGLON Verschil;data = KeQueryPerformanceCounter ((LARGE_INTEGER *) & frequentie)diff impliceert data.QuadPart / (Frequency.QuadPart / gelddeler)
beantwoordde 21 januari verschillende om 14:12
2.686 66 gouden badges 4040 magische badges
Versnel de prestaties van uw computer nu met deze eenvoudige download.