![]() |
Aktuelle CPUFrequenz abfragen (SpeedStep)
Hallo,
ich möchte gerne die Aktuelle CPU Frequenz abfragen. Aber alle Demos die ich gefunden habe zeigen mir nur 4Ghz an obwohl die CPU ohne last auf 0.8Ghz läuft. Wie kann man die wirklich aktuelle Frequenz abfragen? Danke im Voraus |
AW: Aktuelle CPUFrequenz abfragen (SpeedStep)
Ich mache das so:
Delphi-Quellcode:
FUNCTION TimeStamp:Int64;
asm rdtsc {$IFDEF CPUX64} shl rdx,32 or rax,rdx {$ENDIF} end;
Delphi-Quellcode:
FUNCTION GetTimeStampFrequency:Int64;
var OldPriority:Word; Q0,Q1,Qf,Ts0,Ts1:Int64; Seconds:Extended; PaMask,SaMask,TaMask:NativeUInt; begin // Thread nur auf einer CPU ausführen GetProcessAffinityMask(GetCurrentProcess,PaMask,SaMask); if PaMask<>0 then begin TaMask:=1; while TaMask and PaMask=0 do TaMask:=TaMask shl 1; SetThreadAffinityMask(GetCurrentThread,TaMask); end; // Priorität des Threads hochsetzen OldPriority:=GetThreadPriority(GetCurrentThread); SetThreadPriority(GetCurrentThread,THREAD_PRIORITY_TIME_CRITICAL); // QPC- und TimeStamp-Ticks für 10 ms holen QueryPerformanceCounter(Q0); Ts0:=TimeStamp; Sleep(10); Ts1:=TimeStamp; QueryPerformanceCounter(Q1); // Anhand QPF die TimeStamp-Frequenz ermitteln QueryPerformanceFrequency(Qf); Seconds:=(Q1-Q0)/Qf; Result:=Trunc((Ts1-Ts0)/Seconds+0.5); // Ticks/s // Priorität des Threads auf alten Wert stellen und Thread für alle // CPUs freigeben SetThreadPriority(GetCurrentThread,OldPriority); if PaMask<>0 then SetThreadAffinityMask(GetCurrentThread,PaMask); end; |
AW: Aktuelle CPUFrequenz abfragen (SpeedStep)
Klappt leider nicht. Egal ob mit Last oder ohne. Die Werte sind schon etwas komig. :roll:
Abgefragt mit einem Timer alle 500ms. Getestet auf einem Laptop mit Intel Core2(Duo) P8600. Ohne Last. (0,8Ghz) 312738611 241239801 266993435 2393030897 2393232643 2393188605 2393225644 2393234530 Mit Last. (2,5Ghz) 137983889 2393447349 2393455115 2393582694 304749688 2393445973 122108721 183223288 90529087 2393630273 Gruß |
AW: Aktuelle CPUFrequenz abfragen (SpeedStep)
Es gibt nicht (mehr) die aktuelle CPU-Geschwindigkeit. Jeder Kern kann unterschiedlich getaktet sein.
Ebenfalls wird dein Programm bei einer Messung (wenn du ihn nicht auf einen kern bindest) wild zwischen den Kernen hin und her "geworfen" was die Ausführung betrifft. |
AW: Aktuelle CPUFrequenz abfragen (SpeedStep)
Keine Ahnung, ob das hilft, aber ich verwende in Win7 das Gadget CPU-Meter, das mir die Auslastung aller Kerne sowie den verwendeten RAM anzeigt. Ob die Anzeige dieses Gadgets korrekt ist, vermag ich nicht wirklich zu beurteilen. Zumindest stimmt die Gadget-Anzeige in etwa mit der Anzeige im Ressourcenmonitor überein.
Immerhin zeigt die Existenz dieses Gadgets, daß es irgendwie gehen muß :stupid: |
AW: Aktuelle CPUFrequenz abfragen (SpeedStep)
Eine ganz simple Variante ist, die Klasse Win32_Processor via WMI zu befragen (Class property CurrentClockSpeed). Aber wie bereits richtig gesagt wurde, gibt das nur den Takt eines Kerns an, der nicht notwendigerweise mit dem Takt der anderen Kerne übereinstimmen muss. Daher fällt das eher in die Kategorie "CPU-Frequenz auslesen für Arme" ;).
MfG Dalai |
AW: Aktuelle CPUFrequenz abfragen (SpeedStep)
Die WMI-Funktion ist ohne Refresher nicht nutzbar.
Delphi-Quellcode:
// Version: 1.8.3.0
// LIABILITY DISCLAIMER // THIS GENERATED CODE IS DISTRIBUTED "AS IS". NO WARRANTY OF ANY KIND IS EXPRESSED OR IMPLIED. // YOU USE IT AT YOUR OWN RISK. THE AUTHOR NOT WILL BE LIABLE FOR DATA LOSS, // DAMAGES AND LOSS OF PROFITS OR ANY OTHER KIND OF LOSS WHILE USING OR MISUSING THIS CODE. //---------------------------------------------------------------------------------------------------- program GetWMI_Info; {$APPTYPE CONSOLE} uses // SysUtils, ActiveX, ComObj, Variants; System.SysUtils, Winapi.ActiveX, System.Win.ComObj, System.Variants; const WbemUser =''; WbemPassword =''; WbemComputer ='localhost'; wbemFlagForwardOnly = $00000020; function VarToInt(const AVariant: Variant): INT64;// integer; begin Result := StrToIntDef(Trim(VarToStr(AVariant)), 0); end; procedure GetCIM_ProcessorInfo; var FSWbemLocator : OLEVariant; FWMIService : OLEVariant; FWbemObjectSet: OLEVariant; FWbemObject : OLEVariant; oEnum : IEnumvariant; iValue : LongWord; begin; FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); FWMIService := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword); FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM CIM_Processor','WQL',wbemFlagForwardOnly); oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant; while oEnum.Next(1, FWbemObject, iValue) = 0 do begin Writeln(Format('AddressWidth %d',[VarToInt(FWbemObject.AddressWidth)]));// Uint16 Writeln(Format('Availability %d',[VarToInt(FWbemObject.Availability)]));// Uint16 Writeln(Format('Caption %s',[VarToStr(FWbemObject.Caption)]));// String Writeln(Format('ConfigManagerErrorCode %d',[VarToInt(FWbemObject.ConfigManagerErrorCode)]));// Uint32 Writeln(Format('ConfigManagerUserConfig %s',[VarToStr(FWbemObject.ConfigManagerUserConfig)]));// Boolean Writeln(Format('CreationClassName %s',[VarToStr(FWbemObject.CreationClassName)]));// String Writeln(Format('CurrentClockSpeed %d',[VarToInt(FWbemObject.CurrentClockSpeed)]));// Uint32 Writeln(Format('DataWidth %d',[VarToInt(FWbemObject.DataWidth)]));// Uint16 Writeln(Format('Description %s',[VarToStr(FWbemObject.Description)]));// String Writeln(Format('DeviceID %s',[VarToStr(FWbemObject.DeviceID)]));// String Writeln(Format('ErrorCleared %s',[VarToStr(FWbemObject.ErrorCleared)]));// Boolean Writeln(Format('ErrorDescription %s',[VarToStr(FWbemObject.ErrorDescription)]));// String Writeln(Format('Family %d',[VarToInt(FWbemObject.Family)]));// Uint16 Writeln(Format('InstallDate %s',[VarToStr(FWbemObject.InstallDate)]));// Datetime Writeln(Format('LastErrorCode %d',[VarToInt(FWbemObject.LastErrorCode)]));// Uint32 Writeln(Format('LoadPercentage %d',[VarToInt(FWbemObject.LoadPercentage)]));// Uint16 Writeln(Format('MaxClockSpeed %d',[VarToInt(FWbemObject.MaxClockSpeed)]));// Uint32 Writeln(Format('Name %s',[VarToStr(FWbemObject.Name)]));// String Writeln(Format('OtherFamilyDescription %s',[VarToStr(FWbemObject.OtherFamilyDescription)]));// String Writeln(Format('PNPDeviceID %s',[VarToStr(FWbemObject.PNPDeviceID)]));// String Writeln(Format('PowerManagementCapabilities %d',[VarToInt(FWbemObject.PowerManagementCapabilities)]));// Array of Uint16 Writeln(Format('PowerManagementSupported %s',[VarToStr(FWbemObject.PowerManagementSupported)]));// Boolean Writeln(Format('Role %s',[VarToStr(FWbemObject.Role)]));// String Writeln(Format('Status %s',[VarToStr(FWbemObject.Status)]));// String Writeln(Format('StatusInfo %d',[VarToInt(FWbemObject.StatusInfo)]));// Uint16 Writeln(Format('Stepping %s',[VarToStr(FWbemObject.Stepping)]));// String Writeln(Format('SystemCreationClassName %s',[VarToStr(FWbemObject.SystemCreationClassName)]));// String Writeln(Format('SystemName %s',[VarToStr(FWbemObject.SystemName)]));// String Writeln(Format('UniqueId %s',[VarToStr(FWbemObject.UniqueId)]));// String Writeln(Format('UpgradeMethod %d',[VarToInt(FWbemObject.UpgradeMethod)]));// Uint16 Writeln(''); FWbemObject:=Unassigned; end; end; begin try CoInitialize(nil); try GetCIM_ProcessorInfo; finally CoUninitialize; end; except on E:EOleException do Writeln(Format('EOleException %s %x', [E.Message,E.ErrorCode])); on E:Exception do Writeln(E.Classname, ':', E.Message); end; Writeln('Press Enter to exit'); Readln; end. |
AW: Aktuelle CPUFrequenz abfragen (SpeedStep)
Ich glaube ihr verwechselt die Auslastung, die pro Kern anders ist, mit der CPU Clockspeed. Diese Frequenz ist, wenn man es mal platt sagt, Global. Es ist nicht möglich einen Kern mit 1Ghz und einen anderen Kern mit 2Ghz laufen zu lassen.
Dieser Speed wird aus einer Grundfrequenz mit einem Multiplier festgelegt bzw. eingestellt. Es würd ja schon reichen wenn man die Grundfrequenz und den Multiplier wert lesen könnte. Dann einfach mal nehmen und schon hat man den aktuellen Takt. Aber leider find ich rein Garnichts wie und wo ich das auslesen könnte. Es muss aber gehen da z.b. das Programm CoreTemp genau diese werte anzeigt.
Code:
Quelle:
Multiplikator: Der endgültige Takt des Prozessors ergeben sich aus dem Produkt des BCLK und des Multiplikators. Also in Kurzform: BCLKxMulti=CPU-Takt. Da der Multiplikator bei den meisten CPUs nach oben hin gesperrt ist, führt nur eine Erhöhung des BCLK den gewünschten Effekt der Taktsteigerung herbei.
Bsp.: Jeder i7 hat einen BCLK 133MHz, der i7-920 hat den Multi 20 133MHz * 20 = 2667MHz ![]() Gruß EDIT: Danke @hathor, das zeigt mir wirklich die Aktuelle Frequenz an. Ist zwar nicht schnell, aber gut brauchbar. |
AW: Aktuelle CPUFrequenz abfragen (SpeedStep)
@hathor,
ich habe gerade gemerkt, das CurrentClockSpeed nicht den TurboSpeed anzeigt. Er zeigt dann nur den MaxClockSpeed (4001) an. Hat eventuell jemand eine Idee wie ich das "richtig" angezeigt bekomme. Ich habe es auf 2 verschiedenen Rechner getestet. Danke im Voraus |
AW: Aktuelle CPUFrequenz abfragen (SpeedStep)
Liste der Anhänge anzeigen (Anzahl: 2)
Mit VBS ist das einfach:
Code:
Set objWMI = GetObject("winmgmts://./root\cimv2")
set objRefresher = CreateObject("WbemScripting.Swbemrefresher") Set objInterfaces = objRefresher.AddEnum(objWMI, "CIM_Processor").ObjectSet Dim strList, I Wscript.Echo "Click and Wait 10-15 sec ..." objRefresher.Refresh For each RefreshItem in objRefresher For each objInstance in RefreshItem.ObjectSet strList = strList & objInstance.Name _ & vbnewline & " CurrentClockSpeed: " & objInstance.CurrentClockSpeed _ & vbnewline & " MaxClockSpeed: " & objInstance.MaxClockSpeed Next Next strList = strList & vbnewline & "--------------------------------" For I = 1 to 10 objRefresher.Refresh For each RefreshItem in objRefresher For each objInstance in RefreshItem.ObjectSet strList = strList & vbnewline & " CurrentClockSpeed: " & objInstance.CurrentClockSpeed Next Next Wscript.Sleep 500 Next Wscript.Echo strList |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:34 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz