Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Frage zur inline Optimierung (https://www.delphipraxis.net/168697-frage-zur-inline-optimierung.html)

atc 5. Jun 2012 02:47

Delphi-Version: XE2

Frage zur inline Optimierung
 
Hallo,

die folgenden Codes sollten doch eigentlich von der Laufzeit her nach dem Compilieren im Release Modus mit Optimierung identisch sein, oder nicht?
Delphi-Quellcode:
procedure p1(const s:string);
var i,l:integer;
begin
  i:=1;
  l:=length(s);
  while i<=l do
  begin
    //...
    inc(i);
  end;
end;

procedure p2(const s:string);

  function neof(i,l:integer):boolean;inline;
  begin
    result:=i<=l;
  end;

var i,l:integer;
begin
  i:=1;
  l:=length(s);
  while neof(i,l) do
  begin
    //...
    inc(i);
  end;
end;
Sind sie aber leider nicht. p2 ist ungefähr 3x langsamer. Delphi erkennt das Schlüsselwort inline zwar, denn ohne dieses ist p2 ungefähr 10x langsamer.
Aber warum macht der Compiler aus p2 nicht einfach p1? Das verstehe ich gerade nicht. Es muss doch nur das Result beim Funktionsaufruf eingesetzt werden.

jaenicke 5. Jun 2012 05:40

AW: Frage zur inline Optimierung
 
In while- und repeat-Schleifen in der Bedingung benutzte Funktionen können nicht inline eingebunden werden.

Etwas schneller sollte es übrigens sein, wenn du neof außerhalb deiner Funktion definierst und nicht darin. Dann kann der Compiler oft besser optimieren.

Furtbichler 5. Jun 2012 06:34

AW: Frage zur inline Optimierung
 
Zitat:

Zitat von jaenicke (Beitrag 1169532)
In while- und repeat-Schleifen in der Bedingung benutzte Funktionen können nicht inline eingebunden werden.

So ganz kann das nicht stimmen, denn
Zitat:

Zitat von atc (Beitrag 1169530)
p2 ist ungefähr 3x langsamer. Delphi erkennt das Schlüsselwort inline zwar, denn ohne dieses ist p2 ungefähr 10x langsamer.


jaenicke 5. Jun 2012 07:49

AW: Frage zur inline Optimierung
 
Doch, es stimmt, es wird vielleicht besser optimiert, aber nicht wirklich eingebunden. Zumindest in XE2.

Schau halt selbst in den Assemblercode, wenn du es nicht glaubst...

atc 5. Jun 2012 14:49

AW: Frage zur inline Optimierung
 
Zitat:

Zitat von jaenicke (Beitrag 1169532)
In while- und repeat-Schleifen in der Bedingung benutzte Funktionen können nicht inline eingebunden werden.

Doofe Frage vielleicht, aber warum nicht?

Zitat:

Zitat von jaenicke (Beitrag 1169532)
Etwas schneller sollte es übrigens sein, wenn du neof außerhalb deiner Funktion definierst und nicht darin. Dann kann der Compiler oft besser optimieren.

Das habe ich schon probiert und macht so gut wie keinen Unterschied.

Gibt es sonst noch eine andere Möglichkeit? Ich möchte ungerne alle 1-zeiligen Funktionsaufrufe manuell in die Hauptfunktion copy und pasten :x


Edit:
Bei folgendem Code funktioniert das inlining übrigens perfekt:
Delphi-Quellcode:
procedure p3(const s:string);

  function eof(i,l:integer):boolean;inline;
  begin
    result:=i>l;
  end;

var i,l:integer;
begin
  i:=1;
  l:=length(s);
  while true do
  begin
    if eof(i,l) then break;
    //...
    inc(i);
  end;
end;
Das ist aber natürlich ziemlich unschön...

Iwo Asnet 5. Jun 2012 15:06

AW: Frage zur inline Optimierung
 
Kommt es denn in allen Situationen so sehr auf Performance an?

atc 5. Jun 2012 15:10

AW: Frage zur inline Optimierung
 
Nicht bei allen, aber in den meisten Situationen schon.
Wäre es nur einige ms (oder meinetwegen auch 2-3 Sekunden) langsamer, könnte ich es verschmerzen, aber von 5 auf 15 Sekunden - das muss nicht unbedingt sein.

jaenicke 5. Jun 2012 22:13

AW: Frage zur inline Optimierung
 
Zitat:

Zitat von atc (Beitrag 1169589)
Zitat:

Zitat von jaenicke (Beitrag 1169532)
In while- und repeat-Schleifen in der Bedingung benutzte Funktionen können nicht inline eingebunden werden.

Doofe Frage vielleicht, aber warum nicht?

Keine Ahnung, aber ich stelle es mir nicht so einfach vor dort performanten Code zu generieren. Möglich ist es sicher, aber der Aufwand ist sicher nicht zu unterschätzen.
Warum es nun wirklich genau dort nicht geht, kannst du nur die Entwickler selbst fragen. Es ist jedenfalls dokumentiertes Verhalten des Compilers, also kein Zufall.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:32 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