Entwickler-Ecke

Sonstiges (Delphi) - GhZ-Wert berechnen


Mitmischer 1703 - Do 28.01.10 20:59
Titel: GhZ-Wert berechnen
Hi DF!

Ich stehe vor einem Problem.

Ich möchte für einen Installer die GhZ-Zahl eines Prozessors ausrechnen. Im Moment mache ich das so:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure TForm2.GetProcessorPower;
var
  Time: Cardinal;
  ops: Cardinal;
  ops_f: Extended;
  Now : Cardinal;
begin
  if FWorking then
  begin
    ops := 0;
    Time := GeTTickCount;
    while (GetTickCount - Time) < 1000 do
     inc(ops);
    Now := GetTickCount-Time;  // Im Idealfall eine Sekunde
    ops_f := ops / 1000000// Wären es Hertz, die ich da berechnet hätte, waren das hier Megahertz!
    ops_f := (ops_f / (Now))*1000// Wenn eine Sekunde, keine Änderungen. Ansonsten Korrektur.
    ListBox1.Items.Add(FloatToStr(ops_f));
    Application.ProcessMessages;
    GetProcessorPower;
  end;
end;


Durch einen Button wird mein Feld FWorking dann jeweils auf true / false gesetzt

Im FormCreate setze ich außerdem meine Prozesspriorität auf Echtzeit, was aber eh auf Hoch heruntergestuft wird :(


Delphi-Quelltext
1:
2:
SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS);
SetThreadPriority(GetCurrentThread, REALTIME_PRIORITY_CLASS);


Ist das so richtig?

Ich habe es ausprobiert und - schaut in den Anhang - alle meine 4 Kerne scheinen sich zu regen ( was ich nicht will) obwohl laut Prozessansicht nur mein Programm arbeitet. Außerdem bekomme ich bei meinem Code ca. 160 als Ergebnis, was nicht an 2,6 GhZ herankommt. Wonach machen die Taktzahlenbeurteiler ihre Werte denn dann fest?


Xentar - Do 28.01.10 21:44

Hm.. dass ein Prozessor mehr / weniger als einen Befehl pro Takt schafft ist dir klar? Nicht? Dann weißt du es jetzt :D

Wie das bei den "richtigen" Programmen geht, weiß ich auch nicht. Aber könnte mir vorstellen, dass man das einfach auslesen kann?


Mitmischer 1703 - Do 28.01.10 21:52

Na ja, klar war das nach dem WIkipedia-Auszug dann doch:

Häufig verwendete größere Einheiten sind
das Kilohertz, kHz, tausend Schwingungen/Vorgänge pro Sekunde
das Megahertz, MHz, eine Million Schwingungen/Vorgänge pro Sekunde
das Gigahertz, GHz, eine Milliarde Schwingungen/Vorgänge pro Sekunde
das Terahertz, THz, eine Billion Schwingungen/Vorgänge pro Sekunde

Aber die Idee mit dem Auslesen ist klasse! Bei mir stehts im "HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0" bzw. "HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\~MHz" in der Registry. Was steht da bei euch bzw. gibt es diesen Schlüssel bei euch überhaupt?


Flamefire - Do 28.01.10 22:01

Du willst eine Sekunde lang Die Operationen zählen die der Prozessor schafft?
Dir ist aber klar, dass allein das Inc(ops) mehr als eine Operation ist?
Entweder es ist im Register, dann ist es 1 Befehl. Sonst: Lesen, Wert erhöhen, Schreiben -->3 Operationen.
Und deine While schleife sind noch ein paar.
Außerdem ist da ein Aufruf auf Gettickcount, das sind nochmal ewig viele!

Also lieber auslesen -->google


Delete - Do 28.01.10 22:08

Gibt es dafür nicht schon Routinen hier im Forum?


Niko S. - Do 28.01.10 22:13

Keine Ahnung ob du diese Seite kennst, dort gibt es aber sowas auch, also die Taktfrequenz der CPU berechnen.
Delphi-Treff [http://www.delphi-treff.de/tipps/system/]


Jann1k - Fr 29.01.10 00:44

Also, ich hab mal sowas für die Schule machen müssen, Vorgehen dabei war folgendes:

1. Startzeit auslesen
2. Eine leere for-Schleife von 1 bis 1 Million/Milliarde laufen lassen.
3. Endzeit auslesen.
4. Zeit für die for schleife berechnen
5. aus der Zeit und der Länge der Schleife kommst du recht gut an die halben Taktfrequenzeangaben des Prozessors. Die nimmst du noch mal 2 und bist ziemlich nah an den Herstellerangaben. Ich hatte das damals damit begründet, dass das Zählen einer for-Schleife 2 Operationen braucht, einmal das Erhöhen der Zählvariablen und einmal die Überprüfung, ob wir nicht zu weit gezählt haben.
6. Führst du die Schritte 1-5 öfters aus, kannst du einen Mittelwert bilden und so evtl. temporäre Schwankungen rausfiltern.


ABER ACHTUNG: Das ganze hier fusst nicht auf fachlichem Hintergrundwissen, es hat damals ganz gut geklappt. Allerdings weiß ich nicht wie das ergebnis bei Dual- oder Quadcoreprozessoren aussieht.


Delete - Fr 29.01.10 01:00

Und wie hast du die Zeit berücksichtigt, die deine for-Schleife ruht, weil gerade andere Prozesse Rechenzeit zugeteilt bekommen haben?


BenBE - Fr 29.01.10 04:32

user profile iconLuckie hat folgendes geschrieben Zum zitierten Posting springen:
Und wie hast du die Zeit berücksichtigt, die deine for-Schleife ruht, weil gerade andere Prozesse Rechenzeit zugeteilt bekommen haben?

Wie nehmen den SetThreadPriority-Bug von Windows und sorgen dafür, dass wir innerhalb der Zeitscheibe den erneut aufrufen können ;-)

Scherz beiseite: Das meinte er mit "temporären Schwankungen" ... Wobei man mit REALTIME_PRIO schon recht wenige solche Unterbrechungen reinbekommt ...


Delete - Fr 29.01.10 14:15

WINDOWS (z.B.XP) bietet über die Funktionen in powrprof.dll die PROCESSOR_POWER_INFORMATION an.
MAXIMALE FREQUENZ = MaxMhz
REALE FREQUENZ = CurrentMhz

http://www.delphipraxis.net/topic138070_cpufrequenzmessung.html&highlight=processor

Die Funktionen in VISTA haben vermutlich andere Bezeichnungen - weiss jemand Näheres?

http://msdn.microsoft.com/en-us/library/aa373184%28VS.85%29.aspx