AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte CPUiD 3.0 - Ein kleines System - Diagnoseprogramm
Thema durchsuchen
Ansicht
Themen-Optionen

CPUiD 3.0 - Ein kleines System - Diagnoseprogramm

Ein Thema von Daniel G · begonnen am 15. Jul 2005 · letzter Beitrag vom 12. Jun 2008
 
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.377 Beiträge
 
Delphi 12 Athens
 
#11

Re: CPUiD 2.0.1 - Ein kleines CPU - Diagnoseprogramm

  Alt 3. Jan 2006, 14:17
Was ich aber mal denken würde, ist daß in folgendem Code die Reinfolge der Timer nicht stimmt ... denn um die unterschiedlichen Start-/Endzeiten der einzelnen Timer zu vernachlässigen, müssen diese in der selben Reinfolge beendet werden, wie sie auch gestartet wurden.
(timeXXXPeriod und ActivateTimer direkt aufeinander folgend ... und timeGetTime innerhalb der Schleife)
Delphi-Quellcode:
timeBeginPeriod(timecaps.wPeriodMax); <<<
llStart:= ActivateTimer; <<<
dwStart:= timeGetTime;
while ((timeGetTime() - dwStart) < msTime) do
begin
   //
end;
timeEndPeriod(timecaps.wPeriodMax); <<<
llStop:= ActivateTimer; <<<
result:= (llStop - llStart) / msTime;


Dann ist dein ActivateTimer etwas umständlich geschrieben.
(was aber zu keiner Messverfälschung führen wird ... jedenfalls, wenn die Timer in der richtigen Reinfolge gestartet/beendet werden)
Denn du holst dir den TSC-Wert, lädst diesen in den Stack und holst ihn zurück.
Aber wenn du genau hinsiehst, dann wirst du merken, daß sich nach dem Aufruf von RDTSC (DW $310F) die Werte in EAX und EDX nicht verändern.

Du lädst also z.B. EAX per mov [esp], eax in den Stack und holst ihn dann vom Stack wieder per pop eax in EAX zurück ... also "sinnloses" Hinundhergeschiebe.

Es würde also Folgendes vollkommen ausreichen:
Delphi-Quellcode:
function ActivateTimer: Int64;
asm
   db 0fh
   db 31h
end;

Und dann kannte ich deine MultimediaTimerFunktionen (timeBeginPeriod, timeEndPeriod) noch nicht ... weiß einer, wie genau die sind?
Und ob die Intern auch gleichschnell arbeiten und an der selben Stelle die Zeit messen, denn dieses könnte auch noch Fehler in die Gesamtmessung bringen.
Eventuell solltest du es mal mit einem Timer versuchen, bei welchem man die selbe Funktion für den Begin und das Ende der Messung verwenden kann ... z.B. QueryPerformanceCounter.


Und natürlich kann auch ein Fehler in der anschließenden Berechnung sein ... wozu soll daß denn eigentlich diehnen ... ich vermute ja dahinter mal die Tatsache, daß sich der Wert bei mehreren Messungen nicht ändert, denn es wird ja immer ein paar kleine Unterschiede geben, schon alleine dadurch, daß es sich um kein RealTimeSystem beim PC handelt und wie Luckie nachfolgend schon sagt, sich auch leicht andere Prozesse einschleichen und den Wert etwas verändern können.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
 


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 13:05 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