AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Aktuelle CPUFrequenz abfragen (SpeedStep)
Thema durchsuchen
Ansicht
Themen-Optionen

Aktuelle CPUFrequenz abfragen (SpeedStep)

Ein Thema von DelTurbo · begonnen am 10. Nov 2015 · letzter Beitrag vom 15. Nov 2015
Antwort Antwort
Seite 1 von 5  1 23     Letzte »    
DelTurbo

Registriert seit: 12. Dez 2009
Ort: Eifel
1.212 Beiträge
 
Delphi 2007 Architect
 
#1

Aktuelle CPUFrequenz abfragen (SpeedStep)

  Alt 10. Nov 2015, 11:38
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
Alle meine Rechtschreibfehler sind Urheberrechtlich geschützt!!
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.071 Beiträge
 
Delphi XE2 Professional
 
#2

AW: Aktuelle CPUFrequenz abfragen (SpeedStep)

  Alt 10. Nov 2015, 13:03
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;
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
DelTurbo

Registriert seit: 12. Dez 2009
Ort: Eifel
1.212 Beiträge
 
Delphi 2007 Architect
 
#3

AW: Aktuelle CPUFrequenz abfragen (SpeedStep)

  Alt 10. Nov 2015, 14:37
Klappt leider nicht. Egal ob mit Last oder ohne. Die Werte sind schon etwas komig.
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ß
Alle meine Rechtschreibfehler sind Urheberrechtlich geschützt!!
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.198 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Aktuelle CPUFrequenz abfragen (SpeedStep)

  Alt 10. Nov 2015, 19:11
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#5

AW: Aktuelle CPUFrequenz abfragen (SpeedStep)

  Alt 10. Nov 2015, 19:56
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ß
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.682 Beiträge
 
Delphi 5 Professional
 
#6

AW: Aktuelle CPUFrequenz abfragen (SpeedStep)

  Alt 10. Nov 2015, 20:08
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
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#7

AW: Aktuelle CPUFrequenz abfragen (SpeedStep)

  Alt 10. Nov 2015, 20:19
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.
  Mit Zitat antworten Zitat
DelTurbo

Registriert seit: 12. Dez 2009
Ort: Eifel
1.212 Beiträge
 
Delphi 2007 Architect
 
#8

AW: Aktuelle CPUFrequenz abfragen (SpeedStep)

  Alt 11. Nov 2015, 09:13
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:
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
Quelle: http://extreme.pcgameshardware.de/ov...cking.html#a06

Gruß

EDIT: Danke @hathor, das zeigt mir wirklich die Aktuelle Frequenz an. Ist zwar nicht schnell, aber gut brauchbar.
Alle meine Rechtschreibfehler sind Urheberrechtlich geschützt!!

Geändert von DelTurbo (11. Nov 2015 um 09:24 Uhr) Grund: Nachtrag
  Mit Zitat antworten Zitat
DelTurbo

Registriert seit: 12. Dez 2009
Ort: Eifel
1.212 Beiträge
 
Delphi 2007 Architect
 
#9

AW: Aktuelle CPUFrequenz abfragen (SpeedStep)

  Alt 11. Nov 2015, 10:27
@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
Alle meine Rechtschreibfehler sind Urheberrechtlich geschützt!!
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#10

AW: Aktuelle CPUFrequenz abfragen (SpeedStep)

  Alt 11. Nov 2015, 12:24
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
Miniaturansicht angehängter Grafiken
wsh_01.jpg  
Angehängte Dateien
Dateityp: zip CIM_Processor-11.zip (496 Bytes, 15x aufgerufen)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 5  1 23     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:56 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz