AGB  ·  Datenschutz  ·  Impressum  







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

Debuggen in "with"

Ein Thema von Aviator · begonnen am 28. Jun 2013 · letzter Beitrag vom 29. Jun 2013
Antwort Antwort
Benutzerbild von jaenicke
jaenicke
Online

Registriert seit: 10. Jun 2003
Ort: Berlin
9.857 Beiträge
 
Delphi 12 Athens
 
#1

AW: Debuggen in "with"

  Alt 29. Jun 2013, 08:17
Ein anderes Problem bei with ist, dass man z.B. darin Variablennamen benutzt, die dann z.B. durch ein Delphiupdate plötzlich auch in dem with Objekt verfügbar sind. Solche Probleme dann zu finden ist auch extrem aufwendig, da es keinerlei Compilerhinweise darauf gibt.

Da ich auch dazu neige, eher weniger als mehr tippen zu müssen, kopiere ich mir in solchen Fällen das Objekt, dessen Properties und Methoden ich benötige, in den Zwischenspeicher und muß das dann auch nicht mehr tippen, in folgendem Fall die fett markierten Teile:
Ich deklariere da schlicht eine Variable dafür und speichere das zwischen. So funktioniert intern with ja auch. Auf diese Weise ist der Quelltext übersichtlicher, aber nicht langsamer als mit with, ich kann ordentlich debuggen und es gibt keine möglichen Nebeneffekte.
Delphi-Quellcode:
var
  LabelFont: TFont;

LabelFont := Label1.Canvas.Font;
LabelFont.Size := 12;
LabelFont.Name := 'Calibri';
LabelFont.Color := clRed;
LabelFont.Style := [fsBold];
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#2

AW: Debuggen in "with"

  Alt 29. Jun 2013, 08:27
Ein anderes Problem bei with ist, dass man z.B. darin Variablennamen benutzt, die dann z.B. durch ein Delphiupdate plötzlich auch in dem with Objekt verfügbar sind. Solche Probleme dann zu finden ist auch extrem aufwendig, da es keinerlei Compilerhinweise darauf gibt.
Naja, das kann mir bei Delphi 2009 wohl eher nicht passieren
Ist aber dennoch ein gutes Argument

Ich deklariere da schlicht eine Variable dafür und speichere das zwischen. So funktioniert intern with ja auch. Auf diese Weise ist der Quelltext übersichtlicher, aber nicht langsamer als mit with, ich kann ordentlich debuggen und es gibt keine möglichen Nebeneffekte.
Gute Idee! Du meinst, die wiederholte Qualifizierung macht den Code echt langsamer? Das muß ich mir merken ...
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke
Online

Registriert seit: 10. Jun 2003
Ort: Berlin
9.857 Beiträge
 
Delphi 12 Athens
 
#3

AW: Debuggen in "with"

  Alt 29. Jun 2013, 11:22
Du meinst, die wiederholte Qualifizierung macht den Code echt langsamer? Das muß ich mir merken ...
Es wird ja jedesmal der Getter der entsprechenden Eigenschaft aufgerufen. Je nachdem was dieser macht, kann das deutlich langsamer sein.
Und selbst wenn nur die entsprechende Position des Feldes in dem Objekt aufgelöst werden muss, weil es keinen Getter gibt, braucht das mindestens einen Assemblerbefehl pro Stufe mehr.
Dazu kommt, dass der Compiler beim einmaligen Abruf die Register besser optimieren kann, da er ermitteln kann von wo bis wo dieser konkrete Wert benötigt wird und diesen dann z.B. in einem Register halten kann.

Heißt: Langsamer ist es in jedem Fall, wie viel hängt vom konkreten Fall ab.

Im konkreten Fall werden bei jedem Aufruf nur 3 Assemblerbefehle eingespart, weil es keine Getter gibt. Den Unterschied siehst du hier:

AsmAntiWith.png

Links siehst du wie die Kette von Label1 über Canvas und Font aufgelöst wird. Rechts wird der Wert im Stack an Adresse ebp-$08 gespeichert und dann jeweils nur daraus hervorgeholt um dann direkt für den Aufruf in eax gespeichert zu werden. (Das Objekt, auf das sich eine Methode bezieht, wird immer als erster Parameter in eax mitgegeben.)
Bei with kommt übrigens der gleiche Code heraus wie mit der Zwischenvariable, denn wie schon geschrieben macht with ja nichts anderes, nur eben schlechter.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#4

AW: Debuggen in "with"

  Alt 29. Jun 2013, 11:32
Es wird ja jedesmal der Getter der entsprechenden Eigenschaft aufgerufen. Je nachdem was dieser macht, kann das deutlich langsamer sein.
Das leuchtet ein Hab vielen Dank für diese ausführliche und hilfreiche Darstellung
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.303 Beiträge
 
Delphi 12 Athens
 
#5

AW: Debuggen in "with"

  Alt 29. Jun 2013, 12:27
Ich deklariere da schlicht eine Variable dafür und speichere das zwischen. So funktioniert intern with ja auch. Auf diese Weise ist der Quelltext übersichtlicher, aber nicht langsamer als mit with, ich kann ordentlich debuggen und es gibt keine möglichen Nebeneffekte.
So mache ich es in der Regel auch. Daß ich damit Laufzeit einspare war mir bisher nicht wirklich bewusst, aber leuchtet ein.

"With" fliegt bei mir seit einiger Zeit aus dem Code. Immer wenn ich alten Code anfassen muss, dann wird auch "with" entfernt.
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat
Antwort Antwort


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 23:04 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 by Thomas Breitkreuz