Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   FreePascal (https://www.delphipraxis.net/74-freepascal/)
-   -   Lazarus - Inline über mehrere Klassen (https://www.delphipraxis.net/171575-lazarus-inline-ueber-mehrere-klassen.html)

mleyen 13. Nov 2012 10:55

Lazarus - Inline über mehrere Klassen
 
Hi, ich wollte schon immer mal nen Performancevergleich Delphi <-> Lazarus machen und jetzt wo Lazarus 1.~ raus ist hab ich mich mal hingesetzt und ein größeres Projekt portiert.

Iwann hats dann auch endlich kompiliert ... ich die inline direktive angeschaltet ... bäm fpc heult rum ...

Alles umsonst? Oder kennt jemand einen Trick wie Lazarus das frisst?

Delphi-Quellcode:
program inlinetest;

{$IFDEF FPC}{$MODE DELPHI}{$ENDIF}

type
  TClassA = class
  private
    FTmp: Integer;
  public
    function IsOne: Boolean; inline;
    procedure SetToZero;
  end;

  TClassB = class(TClassA)
  public
    function IsOne: Boolean; inline;
  end;

{ TClassA }

function TClassA.IsOne: Boolean;
begin
  Result := FTmp = 1;
end;

procedure TClassA.SetToZero;
begin
  FTmp := 0;
end;

{ TClassB }

function TClassB.IsOne: Boolean;
begin
  result := inherited IsOne;
end;

var
  abcde: TClassB;
begin
  abcde := TClassB.Create;
  if abcde.IsOne then // in Lazarus Kompilerfehler: inlinetest.dpr(47,11) Error: Illegal expression
    abcde.SetToZero;
  abcde.Free;
end.

jaenicke 13. Nov 2012 13:19

AW: Lazarus - Inline über mehrere Klassen
 
Warum das dort (wieder einmal, das Problem kenne ich bei Lazarus) nicht geht, weiß ich nicht, aber ganz allgemein als Hinweis:
Die Verwendung von inline in FPC kann den Code auch verlangsamen statt beschleunigen, je nachdem was im Code passiert. ;-)

shmia 13. Nov 2012 13:32

AW: Lazarus - Inline über mehrere Klassen
 
Wenn man mal diese Funktion anschaut:
Delphi-Quellcode:
function TClassB.IsOne: Boolean;
begin
  result := inherited IsOne;
end;
Dann müsste der Compiler 2-fach inlinen.
Das dürfte doch etwas zuviel verlangt sein obwohl es natürlich theoretisch denkbar wäre, dass ein Compiler das auflösen kann.

jaenicke 13. Nov 2012 17:19

AW: Lazarus - Inline über mehrere Klassen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von shmia (Beitrag 1190980)
Dann müsste der Compiler 2-fach inlinen.
Das dürfte doch etwas zuviel verlangt sein obwohl es natürlich theoretisch denkbar wäre, dass ein Compiler das auflösen kann.

Theoretisch denkbar? :lol:

Anhang 38062

Wie du siehst ist das für Delphi kein Problem. ;-)

himitsu 13. Nov 2012 17:33

AW: Lazarus - Inline über mehrere Klassen
 
Zitat:

Delphi-Quellcode:
{$MODE DELPHI}

Kann auch sein, daß der FPC das in einem anderem Modus kann.


Die richtigen Lazarusjünger werden wohl nicht so oft Delphi-kompatibel arbeiten, womit dort dann vermutlich mehr ginge.

JamesTKirk 14. Nov 2012 10:15

AW: Lazarus - Inline über mehrere Klassen
 
Zitat:

Zitat von mleyen (Beitrag 1190962)
Alles umsonst? Oder kennt jemand einen Trick wie Lazarus das frisst?

Free Pascal von 2.6.0 auf 2.7.1 aktualisieren. ;)

Nein, im Ernst: das war ein Bug in 2.6.0 und älter, der in 2.7.1 gefixt wurde. Trotzdem wird nur der "inherited IsOne" Aufruf geinlined, nicht jedoch das "if abcde.IsOne" (ob das beabsichtigt ist oder nicht kann ich grade jedoch nicht sagen). Auch weiß ich grade nicht ob der Fix in 2.6.1 gemergt wurde und damit Teil von 2.6.2 wird...

Gruß,
Sven

mleyen 14. Nov 2012 17:38

AW: Lazarus - Inline über mehrere Klassen
 
@JamesTKirk: :thumb:
Jetzt kompiliert alles, zwar langsamer und mit myriaden inline-hints, aber vllt setz ich mich nochmal dran und copypaste mal bissl :-D


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:54 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz