Entwickler-Ecke

Sonstiges (Delphi) - Benchmark


Jann1k - Do 21.12.06 02:47
Titel: Benchmark
Gut der einführungsthread wird recht kurz, also folgendes:
ich soll/will ein benchmark programm in Delphi schreiben, dieses soll nur die Leistung der CPU testen/anzeigen, leider fehlt mir irgendwie die Idee wie das jetzt genau zu realisieren ist.

Also: Wie programmiert man einen CPU Benchmark in Delphi?

Thx für jedwede vorschläge


mir is grad eingefallen, dasses doch einen befehl zur abfrage der computerinternen zeit gibt, nur find ich den nicht, wie ging der nochmal?


Horst_H - Do 21.12.06 09:04

Hallo,

indem man zuerst die Priorität seines eigenen Progragrammes erhöht.
Aber bei http://fastcode.sourceforge.net/ sind bei Challenges fast alle mit einem Benchmarkprogramm dabei.
Siehe http://fastcode.sourceforge.net/challenge_content/CharPosIEx.html

Gruss Horst


Jann1k - So 24.12.06 13:31

hmm das hilft mir nicht wirklich weiter da ich in delphi nciht so gut bin, dass ich wirklich was vom quelltext versteh, ich musses ja selber programmieren

jemand ne idee für die funktion die die cpu zeit rausgibt?


jaenicke - So 24.12.06 14:02

Na gut, das ist ja nicht ganz so einfach, deshalb hier mal eine Funtkion, die die Taktfrequenz anhand eines Benchmarks approximiert:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
function TScribaLog.GetCPUSpeed: Double;
const
  TimeOfDelay = 500;
var 
  TimerHigh, TimerLow: DWord;
begin
  SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS);
  SetThreadPriority(GetCurrentThread,  THREAD_PRIORITY_TIME_CRITICAL);
  //Prioritäten auf Maximum setzen, damit ein realistisches Ergebnis bei
  //diesem kleinen Benchmark herauskommt.
  asm
    dw 310Fh
    mov TimerLow, eax
    mov TimerHigh, edx
  end;
  Sleep(TimeOfDelay);
  asm
    dw 310Fh
    sub eax, TimerLow
    sub edx, TimerHigh
    mov TimerLow, eax
    mov TimerHigh, edx
  end;
  Result := TimerLow / (1000.0 * TimeOfDelay);
  SetPriorityClass(GetCurrentProcess, NORMAL_PRIORITY_CLASS);
  SetThreadPriority(GetCurrentThread,  THREAD_PRIORITY_NORMAL);
  //Prioritäten wieder zurücksetzen
end;


Jann1k - Di 26.12.06 00:01

kk danke für die hilfe, sry dass ich mich net früher melde, problem is gelöst