AGB  ·  Datenschutz  ·  Impressum  







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

Code Optimierung zu ".. is <type>"

Ein Thema von TigerLilly · begonnen am 11. Mär 2022 · letzter Beitrag vom 12. Mär 2022
Antwort Antwort
lxo

Registriert seit: 30. Nov 2017
296 Beiträge
 
Delphi 12 Athens
 
#1

AW: Code Optimierung zu ".. is <type>"

  Alt 11. Mär 2022, 11:23
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;
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.560 Beiträge
 
Delphi 12 Athens
 
#2

AW: Code Optimierung zu ".. is <type>"

  Alt 11. Mär 2022, 11:57
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;
Da kann man sich ja mal ansehen, was der Compiler draus macht (siehe Anlage).

Bei "as" erfolgt noch ein Sprung woanders hin (in die system.pas, und dort werden eine Reihe von Befehlen abgearbeitet), das kostet zeit..
Angehängte Grafiken
Dateityp: png AsClass.png (36,0 KB, 35x aufgerufen)

Geändert von Harry Stahl (11. Mär 2022 um 12:00 Uhr)
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.490 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Code Optimierung zu ".. is <type>"

  Alt 11. Mär 2022, 13:52
Bei "as" erfolgt noch ein Sprung woanders hin (in die system.pas, und dort werden eine Reihe von Befehlen abgearbeitet), das kostet zeit..
Ich behaupte: das hängt von der Betrachtungsweise ab
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.
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.560 Beiträge
 
Delphi 12 Athens
 
#4

AW: Code Optimierung zu ".. is <type>"

  Alt 11. Mär 2022, 19:13
Bei "as" erfolgt noch ein Sprung woanders hin (in die system.pas, und dort werden eine Reihe von Befehlen abgearbeitet), das kostet zeit..
Ich behaupte: das hängt von der Betrachtungsweise ab
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.
Ich habe ja gar keine Aussage dazu gemacht, wie man es besser macht, sondern wollte nur die Erklärung zeigen, warum das unterschiedlich schnell ist...
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.487 Beiträge
 
Delphi 12 Athens
 
#5

AW: Code Optimierung zu ".. is <type>"

  Alt 11. Mär 2022, 20:52
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.
  Mit Zitat antworten Zitat
BerndS

Registriert seit: 8. Mär 2006
Ort: Jüterbog
493 Beiträge
 
Delphi 12 Athens
 
#6

AW: Code Optimierung zu ".. is <type>"

  Alt 11. Mär 2022, 22:43
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:
  if (Component is TLabel) then
  begin
    if pos('||',TLabel(Component).Caption) = 0 then
    begin
      ....
      TLabel(Component).Caption := TLabel(Component).Caption + ' || ' + s;
    end;
  end;
end
Die Verwendung einer weiteren Variante ist so nicht notwendig.
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.487 Beiträge
 
Delphi 12 Athens
 
#7

AW: Code Optimierung zu ".. is <type>"

  Alt 12. Mär 2022, 09:10
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;
  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 13:28 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