| Autor |
Beitrag |
Mitmischer 1703
      
Beiträge: 754
Erhaltene Danke: 19
Win 7, Debian
Delphi Prism, Delphi 7, RAD Studio 2009 Academic, C#, C++, Java, HTML, PHP
|
Verfasst: 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:
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; ops_f := ops / 1000000; ops_f := (ops_f / (Now))*1000; 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?
Einloggen, um Attachments anzusehen!
_________________ Die Lösung ist nicht siebzehn.
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: 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
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 
      
Beiträge: 754
Erhaltene Danke: 19
Win 7, Debian
Delphi Prism, Delphi 7, RAD Studio 2009 Academic, C#, C++, Java, HTML, PHP
|
Verfasst: 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
      
Beiträge: 1207
Erhaltene Danke: 31
Win 10
Delphi 2009 Pro, C++ (Visual Studio)
|
Verfasst: 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
|
Verfasst: Do 28.01.10 22:08
Gibt es dafür nicht schon Routinen hier im Forum?
|
|
Niko S.
      
Beiträge: 566
Erhaltene Danke: 10
Win 7, Ubuntu
Lazarus, Turbo Delphi, Delphu 7 PE
|
Verfasst: 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
      
Beiträge: 866
Erhaltene Danke: 43
Win 7
TurboDelphi, Visual Studio 2010
|
Verfasst: 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
|
Verfasst: 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
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Fr 29.01.10 04:32
Luckie hat folgendes geschrieben : | | 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
|
Verfasst: 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
|
|
|