Autor Beitrag
Mitmischer 1703
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 754
Erhaltene Danke: 19

Win 7, Debian
Delphi Prism, Delphi 7, RAD Studio 2009 Academic, C#, C++, Java, HTML, PHP
BeitragVerfasst: Do 28.01.10 20:59 
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:

ausblenden 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 :(

ausblenden 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?
Einloggen, um Attachments anzusehen!
_________________
Die Lösung ist nicht siebzehn.
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: 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?

_________________
PROGRAMMER: A device for converting coffee into software.
Mitmischer 1703 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 754
Erhaltene Danke: 19

Win 7, Debian
Delphi Prism, Delphi 7, RAD Studio 2009 Academic, C#, C++, Java, HTML, PHP
BeitragVerfasst: 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?

_________________
Die Lösung ist nicht siebzehn.
Flamefire
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1207
Erhaltene Danke: 31

Win 10
Delphi 2009 Pro, C++ (Visual Studio)
BeitragVerfasst: 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
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 28.01.10 22:08 
Gibt es dafür nicht schon Routinen hier im Forum?
Niko S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 566
Erhaltene Danke: 10

Win 7, Ubuntu
Lazarus, Turbo Delphi, Delphu 7 PE
BeitragVerfasst: 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
Jann1k
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 866
Erhaltene Danke: 43

Win 7
TurboDelphi, Visual Studio 2010
BeitragVerfasst: 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.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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 ...

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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

www.delphipraxis.net...;highlight=processor

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

msdn.microsoft.com/e...3184%28VS.85%29.aspx