![]() |
Delphi-Version: 5
Code Optimierung zu ".. is <type>"
Ich habe eine Reihe solcher Konstrukte:
Code:
Optimiert das der Compiler oder wäre ein
if (Component is TLabel) then begin
if pos('||', (Component as TLabel).Caption) = 0 then begin .... (Component as TLabel).Caption := (Component as TLabel).Caption + ' || ' + s; end; end; end;
Code:
eine sinnvolle Optimierung?
if (Component is TLabel) then begin
Label:=TLabel(Component); if pos('||', Label.Caption) = 0 then begin .... Label.Caption := Label.Caption + ' || ' + s; end; end; end; Danke für Input! |
AW: Code Optimierung zu ".. is <type>"
Auf jeden Fall ist (lComponent as TLabel) langsamer als TLabel(lComponent).
TLabel(lComponent) aber vorher in eine Variable vom Typen TLabel zu schreiben scheint keinen Unterschied zu geben. Hier einmal ein Beispiel. Wieso das so ist kann ich aber auch nicht genau sagen, würde mich aber auch interessieren.
Delphi-Quellcode:
type
TTest = class Int: Integer; end; procedure TForm105.Button1Click(Sender: TObject); var lObject: TObject; i : Integer; lStopwatch: TStopwatch; lTest: TTest; begin lObject := TTest.Create; try lTest := TTest( lObject); lStopwatch := TStopwatch.StartNew; for I := 0 to MaxInt do begin // (lObject as TTest).Int := i; // 8,7 Sekunden // TTest( lObject).Int := i; // 2,5 Sekunden // lTest.Int := i; // 2,5 Sekunden end; lStopwatch.Stop; ShowMessage( lStopwatch.Elapsed.Duration.ToString); finally lObject.Free; end; end; |
AW: Code Optimierung zu ".. is <type>"
Belegen kann ich das nicht, aber würde denken, dass es eine theoretische aber real kaum messbare Verzögerung gibt.
Du kannst ja die Stelle 10 Mio mal durchlaufen lassen und die Zeiten messen. Allerdings würde ich allein aus Gründen der Lesbarkeit schon die zweite Form (temporäre Zwischenvariable) wählen. |
AW: Code Optimierung zu ".. is <type>"
Wenn man so etwas öfter macht lohnt sich evtl. auch so etwas hier, da bekommt man mit den Generics gleich Typsicherheit rein und brauch gar nichts mehr casten:
![]() |
AW: Code Optimierung zu ".. is <type>"
Wenn du die Zwischenvariable nicht willst, kannst du nach dem
Delphi-Quellcode:
bedenkenlos den Cast
if Component is TLabel then
Delphi-Quellcode:
innerhalb des then-Scopes verwenden. Du hast da ja bereits sichergestellt, das Component wirklich ein TLabel ist.
TLabel(Component)
|
AW: Code Optimierung zu ".. is <type>"
Zitat:
Dennoch: Bringt der Weg über die Zwischenvariable was? |
AW: Code Optimierung zu ".. is <type>"
Zitat:
Delphi-Quellcode:
und
then begin
Delphi-Quellcode:
.
end
Delphi-Quellcode:
if (Component is TLabel) then begin
var Label:=TLabel(Component); if pos('||', Label.Caption) = 0 then begin .... Label.Caption := Label.Caption + ' || ' + s; end; end; end; |
AW: Code Optimierung zu ".. is <type>"
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Bei "as" erfolgt noch ein Sprung woanders hin (in die system.pas, und dort werden eine Reihe von Befehlen abgearbeitet), das kostet zeit.. |
AW: Code Optimierung zu ".. is <type>"
Zitat:
Ja es kostet CPU-Zeit. Ohne das kann es aber wesentlich mehr Entwickler-Zeit kosten. Ich meine: wenn man nicht sehr abstruse Dinge machen kann ist in der UI die Zeit für das is oder as vernachlässigbar. Besser ist es so zu machen wie Uwe es vorgeschlagen hat. |
AW: Code Optimierung zu ".. is <type>"
Zitat:
|
AW: Code Optimierung zu ".. is <type>"
:thumb: Gut zu wissen.
MaxInt ist etwas über 2,1 Milliarden. Wenn man tatsächlich mal eine Anwendung schreibt die 200.000.000 unsichere Typ-Cast ausführt, spart das 6,2 Millisekunden Laufzeit. Wie viel Entwicklungszeit sich bei der Fehlersuche sparen lässt, wenn man statt dessen "as" verwendet, lässt sich leider nicht testen. :roll: |
AW: Code Optimierung zu ".. is <type>"
Ich hatte erwartet, dass nach Uwes Beitrag die Frage beantwortet ist. Denn nach der ersten if Component is TLabel macht eine weitere Prüfung per as doch keinen Sinn mehr.
Man könnte es aber auch so machen. Aber with sollte ja nicht mehr verwendet werden. Hier wird die Typenprüfung gemacht und für den Fall, dass dieser nicht passt die Exception abgefangen.
Delphi-Quellcode:
try
with (Component as TLabel) do if pos('||', Caption) = 0 then begin .... Caption := Caption + ' || ' + s; end; except end; Ohne with würde ich diese Variante verwenden.
Delphi-Quellcode:
Die Verwendung einer weiteren Variante ist so nicht notwendig.
if (Component is TLabel) then
begin if pos('||',TLabel(Component).Caption) = 0 then begin .... TLabel(Component).Caption := TLabel(Component).Caption + ' || ' + s; end; end; end |
AW: Code Optimierung zu ".. is <type>"
Ich bevorzuge diese Variante:
Delphi-Quellcode:
procedure TuAllesMögliche(Sender: TObject);
procedure TuWasMitLabel(ALabel: TLabel); begin if pos('||', ALabel.Caption) = 0 then begin .... ALabel.Caption := ALabel.Caption + ' || ' + s; end; end; begin if Sender is TLabel then TuWasMitLabel(TLabel(Sender)); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:45 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