AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Performance: mein Programm trödelt!

Ein Thema von NicoleWagner · begonnen am 10. Jun 2020 · letzter Beitrag vom 12. Jun 2020
Antwort Antwort
Seite 1 von 2  1 2      
Benmik

Registriert seit: 11. Apr 2009
578 Beiträge
 
Delphi 12 Athens
 
#1

AW: Performance: mein Programm trödelt!

  Alt 10. Jun 2020, 14:56
Ich bin schon ein bisschen baff, weil ich dauernd an meinen Routinen (Grafikverarbeitung) herumbastle und schaue, ob ich sie nicht ein bisschen schneller kriege. Ich nehme dazu schlicht und einfach GetTickCount , in den seltensten Fällen QueryPerformanceCounter , und ich dachte, alle anderen täten das auch.

Meine einfachste Messvorrichtung geht so:
Delphi-Quellcode:
procedure Zeit(var GTC:Cardinal;Anzeigen:Boolean = False);
begin
  If Anzeigen
    then Showmessage('Benötigte Zeit: ' + FormatFloat('0,',GetTickCount - GTC) + ' Millisekunden. ')
    else GTC := GetTickCount;
end;

procedure MachWas;
var GTC:Cardinal;
begin
  Zeit(GTC);
  Sleep(100);
  Zeit(GTC,True);
end;
Die aufgebohrte Fassung, mit der ich beliebig viele Verarbeitungen auf einen Schlag erwische, egal, wo sie sich befinden, geht so (habe allerdings erst kürzlich daran herumgebosselt, Bugs sind also möglich):
Delphi-Quellcode:
procedure Zeit(Titel:string;var Txt:string;var GTC:Cardinal;ZeitEnde:Boolean = False;Anzeigen:Boolean = False);
var AnzMsec:Cardinal;
const LZ5 = #32#32#32#32#32;
begin
  // Schluss aller Zeitmessungungen, Anzeige Ergebnis
  If Anzeigen then begin
    AnzMsec := GetTickCount - GTC;
    Txt := Txt + FormatFloat('0,',AnzMsec) + ' msec';
    Showmessage(Txt);
  // Endpunkt der aktuellen Zeitmessung ohne sofortigen Beginn der nächsten Zeitmessung
  end else if ZeitEnde then begin
    AnzMsec := GetTickCount - GTC;
    Txt := Txt + FormatFloat('0,',AnzMsec) + ' msec' + sLineBreak;
  // Endpunkt der aktuellen Zeitmessung mit sofortigem Beginn der nächsten Zeitmessung
  end else if EndsText(LZ5,Txt) then begin
    AnzMsec := GetTickCount - GTC;
    Txt := Txt + FormatFloat('0,',AnzMsec) + ' msec' + sLineBreak;
    Txt := Txt + Titel + ': ' + LZ5;
    GTC := GetTickCount;
  // Beginn der allerersten Zeitmessung oder Aufruf einer neuen Zeitmessung ohne andere Messung unmittelbar davor
  end else if (Txt = '') or EndsText(sLineBreak,Txt) then begin
    Txt := Txt + Titel + ': ' + LZ5;
    GTC := GetTickCount;
  end else begin
    Showmessage('Fehler bei der Anordnung der Aufrufe.');
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var GTC:Cardinal; Txt:string;
begin
  Zeit('procedure Zeitfresser1',Txt,GTC);
  Sleep(100);
  Zeit('procedure Zeitfresser2',Txt,GTC);
  Sleep(200);
  Zeit('',Txt,GTC,True);
  // Andere Verarbeitungen
  Zeit('procedure Zeitfresser3',Txt,GTC);
  Sleep(300);
  Zeit('',Txt,GTC,False,True);
  Application.Terminate;
end;
Während der Entwicklungszeit (also ein paar Jahre lang...) benutze ich globale Variablen für GTC und Txt, damit ich sie nicht immer deklarieren muss.

Geändert von Benmik (10. Jun 2020 um 16:52 Uhr) Grund: sLineBreak, damit Sherlock friedlich ist
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Performance: mein Programm trödelt!

  Alt 10. Jun 2020, 15:02
DateTime/String (vor allem für längere Logs), GetTickCount und es git auch eine neuere Stopuhrklasse, deren Name ich immer vergesse.

Zitat:
#10#13
Falsch, denn für viele Programme/Codes sind #10#13 zwei Zeilenumgrüche (#10 + #13), anstatt Einem (#13#10).
#10 (Linux/Unix), #13 (Apple) oder #13#10 (Windows)
(wobei Apple inzwischen von #13 zu #10 gewechselt ist, aber z.B. das aktuelle RichEdit im Windows nutzt eigenartiger Weise #13)
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (10. Jun 2020 um 15:13 Uhr)
  Mit Zitat antworten Zitat
Benmik

Registriert seit: 11. Apr 2009
578 Beiträge
 
Delphi 12 Athens
 
#3

AW: Performance: mein Programm trödelt!

  Alt 10. Jun 2020, 15:06
Manchmal geht #10#13, manchmal #10, manchmal #13, ich probiere es einfach aus. #9 geht in Showmessage leider nicht, daher meine Konstruktion mit Leerzeichen.
Vielleicht noch hier die Version mit QueryPerformanceCounter :
Delphi-Quellcode:
function HLStoppUhr(Start:Boolean;var Zeitwert:Int64;MSek:Boolean = False;Meldung:Boolean = True):Extended;
var Frequenz,EndWert:Int64;
begin
  If Start then begin
    QueryPerformanceCounter(Zeitwert);
    Result := 0;
  end else begin
    QueryPerformanceFrequency(Frequenz);
    QueryPerformanceCounter(EndWert);
    Result := (EndWert - Zeitwert) * (1 / Frequenz);
    If MSek
      then Result := Result * 1000;
    If Meldung then begin
      If MSek
        then Showmessage('Benötigte Zeit: ' + MitTPkt(Result) + ' Millisekunden ')
        else Showmessage('Benötigte Zeit: ' + MitTPkt(Result) + ' Sekunden ');
    end;
  end;
end;

Geändert von Benmik (10. Jun 2020 um 15:08 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.826 Beiträge
 
Delphi 12 Athens
 
#4

AW: Performance: mein Programm trödelt!

  Alt 10. Jun 2020, 15:11
Delphi-Referenz durchsuchenTStopwatch ist eine ganz Super Sache.
Und auf jeden Fall (ich lasse mich da auf keine Diskussionen rund um Sonderfälle ein) immer #13#10.

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Benmik

Registriert seit: 11. Apr 2009
578 Beiträge
 
Delphi 12 Athens
 
#5

AW: Performance: mein Programm trödelt!

  Alt 10. Jun 2020, 15:16
Und auf jeden Fall ... immer #13#10.
Mache ich auch, aber neulich ging #10#13 nicht (hab vergessen wo).

TStopwatch ist bestimmt toll, aber bin zu träge, um mich umzugewöhnen, und man muss auch immer System.Diagnostics in uses haben. Mit der globalen Variablen setze ich meine Funktion ohne jeden Aufwand.

PS: Und man kann die Namen der interessierenden Prozesse nicht angeben.
  Mit Zitat antworten Zitat
DasWolf

Registriert seit: 7. Jun 2016
76 Beiträge
 
Delphi 10.1 Berlin Professional
 
#6

AW: Performance: mein Programm trödelt!

  Alt 10. Jun 2020, 15:44
und man muss auch immer System.Diagnostics in uses haben. Mit der globalen Variablen setze ich meine Funktion ohne jeden Aufwand.
Das ist jetzt nicht wirklich Dein Ernst, oder? Wo holst Du Dir Deine Funktion denn her?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Performance: mein Programm trödelt!

  Alt 10. Jun 2020, 15:47
Aus einer großen eigenen Master-Unit, wo ALLES eingebaut ist, was man braucht, und die immer und überall eingefügt wird.


Jetzt, wo die Codevervollständigung nun endlich auch bei Units mit Namespace Punkten funktioniert, hab ich da hoffentlich nun auch weniger Probleme mit solchen Unitnamen.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benmik

Registriert seit: 11. Apr 2009
578 Beiträge
 
Delphi 12 Athens
 
#8

AW: Performance: mein Programm trödelt!

  Alt 10. Jun 2020, 15:48
Wo holst Du Dir Deine Funktion denn her?
Ich habe eine Unit ModulAllgemein , in der alle meine Fundstücke der letzten 200 Jahre stehen und die grundsätzlich in alles eingebunden wird.

@Himitsu: Genau so isses!

... und die natürlich mittlerweile auch große Anteile von Friedhof, Altersheim und Museum hat...
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.602 Beiträge
 
Delphi 7 Professional
 
#9

AW: Performance: mein Programm trödelt!

  Alt 10. Jun 2020, 15:33
Seit Schreibmaschinen bzw. Fernschreiberzeiten (und beim Computer seit DOS-Zeiten) ist es carriage return line feed -> CR LF -> 0x0D 0x0A -> #13#10 in Delphi definiert als
Delphi-Quellcode:
unit System;
...
const
  sLineBreak = {$IFDEF LINUX} #10 {$ENDIF} {$IFDEF MSWINDOWS} #13#10 {$ENDIF};
...
Nimmt man einfach diese Konstante, dann hat man automatisch das Richtige, wenn man mal nicht für Windows, sondern für Linux kompiliert. Und ein "manchmal geht's, manchmal nicht, ich weiß nicht mehr wo ...', gibt es dann nicht mehr

Und auf jeden Fall ... immer #13#10.
Mache ich auch, aber neulich ging #10#13 nicht (hab vergessen wo).
@Benmik

#10#13 ist ja auch falsch, dass muss nicht gehen.

Es heißt #13#10.
Also zwei Werte, absteigend sortiert und nicht aufsteigend
  Mit Zitat antworten Zitat
Benmik

Registriert seit: 11. Apr 2009
578 Beiträge
 
Delphi 12 Athens
 
#10

AW: Performance: mein Programm trödelt!

  Alt 10. Jun 2020, 15:54
#10#13 ist ja auch falsch, dass muss nicht gehen. Es heißt #13#10.
Ja, genau, und neulich ging es nur andersrum... Egal, sLineBreak habe ich schon 10 x vergessen, jetzt versuche ich ein 11. Mal...
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 02:39 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