QueryPerformanceCounter() ist absolut exakt, laut Microsoft, wenn die dummen BIOS Programmierer nichts falsch gemacht haben. Aber was interessiert mich das BIOS wenn ich als Programmierer das Microsoft
API benutze.
Man kann die Auflösung von GetTickCount() ins Unendliche erhöhen, man muß nur unendlich viele Messungen durchführen, deren Resultate akkumulieren und damit einen Mittelwert berechnen. Das geht defakto mit jedem Messverfahren.
Praktisch gesehen ist das aber alles Theorie denn wir haben nicht unendlich viel Zeit.
Nein, meiner Meinung nach ist es Aufgabe jedes
OS eine relativ genaue Zeitbasis zur Verfügung zu stellen. Aber exakt das ist mit den neueren CPUs/BIOSen/OSen wohl nicht mehr gegeben.
Ich habe meine Routinen auf GetTickCount() umgeschrieben, da mir im Grunde dessen Auflösung fast ausreicht. Man muß halt dann sehr schnelle Routinen mehrfach ausmessen und den GetTickCount() Wert eben nach der Berechnung dividieren.
Davon abgesehen wird man sich, selbst mit einer höchstgenauen Zeitbasis, die Frage gefallen lassen müssen, wie effektiv genau nun die gemessenen Werte sein können, wenn Treiber, Taskmanagement etc.pp. sowieso diese Messungen verfälschen werden.
Anders ausgedrückt: wie Olli es schon andeutete bekommen wir nur dann eine exakte Messung mit einer hochgenauen Zeitbasis, wenn wir sicherstellen können das die auszumessende Funktion auch wirklich die einzigste Funktion ist die wir ausmessen. Das können wir nur wenn wir alle
OS/BIOS/Hardware Funktionen die dazwischen funken könnten, deaktivieren. Es reicht also noch nichtmal wenn wir unsere Funktion auf Ring0 mit höchster Priorität ausführen, denn die Hardware mit ihren intelligenten Sub-Controlern (Noth/South Brige, USB, DMA, Speicher, Cache usw. usf.) wird auch dazwischen funken.
Wenn wir das alles geschafft haben auszuschalten, dann bleibt das Problem der CPUs. Denn heutige CPUs sind unberechenbar in ihren Taktzyklen die sie benötigen für den Machinencode. Es ist eben nicht mehr so das ein OpCode wie ADD EAX,EAX exakt X Takte benötigt, sondern je nach Pipline/Cache etc. Status kann dies stark variieren.
@Oliver:
Ja, interessant wäre es durchaus mal sowas zu programmieren. ABER! es verstösst dann gegen meine jetzige Grundregel -> "vermeide unnötigen Streß in der Programmierng indem du den Mist der anderen Coder nicht versuchst besser zu machen !"
Besonders weil man Jahre damit verbringen kann, und in diesen Jahren haben diese Coder/Marketingleute schon wieder 5 neuere Systeme auf den Markt gebracht. Man kommt, ob man es will oder nicht, also immer in Verzug, und rennt diesen "aktuellen Trends und Modeerscheinungen" quasi immer mehr hinterher.
Ergo: interessant wäre es, aber es ist Zeitverschendung aus meiner Sicht.
[edit]
Man könnte also mit QueryPerformanceCounter() eine bessere Genauigkeit als GetTickCount() erreichen, das ist fakt. Die Frage ist nur wie unserere "Komponnente" den WorstCase (Fall, ups doppelt gemoppelt) das der QPC falsche Werte liefert, detektieren kann. In diesem Moment müsste unserere "Komponente" das erkennen können und auf einen anderen Timer ausweichen. Leider gibt es eben keinen exakten Weg genau das zu machen. Eine Sache wie mit GetTickCount() den QPC zu verfizieren ist für mich eine grauenhafte Vorstellung, man kann den Teufel nicht mit dem Belzebub austreiben
Ergo: gehe ich pragmatisch vor, GetTickCount(), und mehr geht nicht.
[/edit]
Gruß Hagen