Freak-Forum - PASCAL DEVELOPMENT THREAD

CPU-Speed messen (nicht auslesen)

CPU-Speed messen (nicht auslesen)

uses
SysUtils, Windows;

function CalcCPUSpeed: Extended;
const
DelayTime = 500;
var
TimerHi, TimerLo: DWord;
PriorityClass, Priority: Integer;
begin
try
PriorityClass := GetPriorityClass(GetCurrentProcess);
Priority := GetThreadPriority(GetCurrentThread);

SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS);
SetThreadPriority(GetCurrentThread,
THREAD_PRIORITY_TIME_CRITICAL);

Sleep(10);
asm
dw 310Fh // rdtsc
mov TimerLo, eax
mov TimerHi, edx
end;
Sleep(DelayTime);
asm
dw 310Fh // rdtsc
sub eax, TimerLo
sbb edx, TimerHi
mov TimerLo, eax
mov TimerHi, edx
end;

SetThreadPriority(GetCurrentThread, Priority);
SetPriorityClass(GetCurrentProcess, PriorityClass);

Result := TimerLo / (1000.0 * DelayTime);
except
Result := 0;
end;
end;



2 Hinweise seien gegeben: auf ganz alten CPUs (386er?) läuft das ned; und der andere: als Funktionswert wird ein Wert vom Typ Extended zurückgegeben. Dies ist ein extrem hoher Wertebereich mit Nachkommastellen. Um ihn ordentlich nutzen zu können, solltet ihr ihn formatieren - z.B. so:

a := FormatFloat('0',CalcCPUSpeed);
Writeln(a);



Hier eine kleine Konsolen-Anwendung als Beispiel:

program Project1;

{$APPTYPE CONSOLE}

uses
SysUtils, Windows;

var
a: String;

function CalcCPUSpeed: Extended;
const
DelayTime = 500;
var
TimerHi, TimerLo: DWord;
PriorityClass, Priority: Integer;
begin
try
PriorityClass := GetPriorityClass(GetCurrentProcess);
Priority := GetThreadPriority(GetCurrentThread);

SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS);
SetThreadPriority(GetCurrentThread,
THREAD_PRIORITY_TIME_CRITICAL);

Sleep(10);
asm
dw 310Fh // rdtsc
mov TimerLo, eax
mov TimerHi, edx
end;
Sleep(DelayTime);
asm
dw 310Fh // rdtsc
sub eax, TimerLo
sbb edx, TimerHi
mov TimerLo, eax
mov TimerHi, edx
end;

SetThreadPriority(GetCurrentThread, Priority);
SetPriorityClass(GetCurrentProcess, PriorityClass);

Result := TimerLo / (1000.0 * DelayTime);
except
Result := 0;
end;
end;

begin
Writeln('Realwert: ',CalcCPUSpeed);
Writeln;
Writeln('Erste Art der Darstellung:');
a := FormatFloat('0',CalcCPUSpeed);
Writeln(a,' MHz');
Writeln;
Writeln('Zweite Art der Darstellung:');
a := FormatFloat('0,',CalcCPUSpeed);
Writeln(a,' MHz');
Writeln;
Writeln('Dritte Art der Darstellung (im Code):');
a := FormatFloat('0," MHz"',CalcCPUSpeed);
Writeln(a);
Readln;
end.

Re: CPU-Speed messen (nicht auslesen)

funzt sogar!
(1541 MHz) ^^

allerdings habe isch hier schon probleme zurchzublicken... :(

Re: CPU-Speed messen (nicht auslesen)

mach doch mit "*" markierungen in deinen Quelltext rein, dann haste ne bessere Übersicht

also zum Beispiel *Kapitel 1*

Re: CPU-Speed messen (nicht auslesen)

ehm...
zum einen mach isch das (sonst hat man gar keinen überblick mehr *gg*)
und zum anderen mach isch das immer mit { ...

isch kann euch ja mal eine Prozedur hier rein stellen (siehe meinen Threat)!

Re: CPU-Speed messen (nicht auslesen)

Zitat: ~[GøG
~]
funzt sogar!
(1541 MHz) ^^

allerdings habe isch hier schon probleme zurchzublicken... :(ja, is ned einfach wenn die Leerzeichen vorne Zurückgenommen werden.

ich probier mal ob es mit diesem "Code"-Command die Leerzeichen beibehält:

procedure TestFunktion;
Leckmich;
if I := 10 downto 0 do
begin
NochmehrLecken;
// Eingerückter Kommentar
end;
end;

so wenn dieses zeuch richtig dargestellt wird, kann man den Code-Tag verwenden (sieht im zusammenhang mit Pascal vielleicht ned gut aus... aber wen interessierts).

Re: CPU-Speed messen (nicht auslesen)

nein.... wird nicht angezeigt....

*grummel*

wie wärs größere Codes/undurchschaubare Codes jetzt nur noch als RTF-Dokument oder so zu posten?

Re: CPU-Speed messen (nicht auslesen)

gibts da nicht extra ein forum-tag, dass codes richtig (also mit Leerzeichen) dargestellt werden? also das war fürs vbulletin en plugin, vielleicht funzt das hier auch

Re: CPU-Speed messen (nicht auslesen)

ich wechsle mal in den "professional-mode" zum schreiben von Posts.

Vielleicht ist da was dabei.

Re: CPU-Speed messen (nicht auslesen)

So, der Professional-Mode ist aktiv, außerdem hab ich auf Wunsch von eX die moderierten Mitlgieder aktiviert, das bedeutet, das neue Mitglieder erst durch mich bestätigt werden müssen.

Test ob Leerzeichen nun endlich bleiben (ich hab die formatierungen selbst hinzugefügt):

function Test(a: integer): String;
begin
 if a=1 then Result := 'a ist eins';
 if a>1 and a<5 then
 begin
  Result := 'a zwischen 1 und 5';
 end;
end;

Das ganze nochmal mit der Funktion des Einzugs, der im neuen Post-Editor vorhanden ist (leider muss dazu ein größerer Zeilenabstand her):

function Test(a: integer): String;

begin

if a=1 then Result := 'a ist eins';

if a>1 and a<5 then

begin

Result := 'a zwischen 1 und 5';

end;

end;

Re: CPU-Speed messen (nicht auslesen)

Wow.. beides funktioniert!!!

Dann nehmen wir lieber das erste.

Wenn
ihr
kleine
Zeilenabstände wollt (keine Doppelten),
müsst ihr
SHIFT+ENTER
drücken.