AGB  ·  Datenschutz  ·  Impressum  







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

Frage zur inline Optimierung

Offene Frage von "jaenicke"
Ein Thema von atc · begonnen am 5. Jun 2012 · letzter Beitrag vom 5. Jun 2012
Antwort Antwort
atc

Registriert seit: 3. Dez 2010
17 Beiträge
 
#1

Frage zur inline Optimierung

  Alt 5. Jun 2012, 03:47
Delphi-Version: XE2
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.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.580 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Frage zur inline Optimierung

  Alt 5. Jun 2012, 06:40
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#3

AW: Frage zur inline Optimierung

  Alt 5. Jun 2012, 07:34
In while- und repeat-Schleifen in der Bedingung benutzte Funktionen können nicht inline eingebunden werden.
So ganz kann das nicht stimmen, denn
p2 ist ungefähr 3x langsamer. Delphi erkennt das Schlüsselwort inline zwar, denn ohne dieses ist p2 ungefähr 10x langsamer.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.580 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Frage zur inline Optimierung

  Alt 5. Jun 2012, 08:49
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...
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
atc

Registriert seit: 3. Dez 2010
17 Beiträge
 
#5

AW: Frage zur inline Optimierung

  Alt 5. Jun 2012, 15:49
In while- und repeat-Schleifen in der Bedingung benutzte Funktionen können nicht inline eingebunden werden.
Doofe Frage vielleicht, aber warum nicht?

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


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...

Geändert von atc ( 5. Jun 2012 um 16:04 Uhr)
  Mit Zitat antworten Zitat
Iwo Asnet

Registriert seit: 11. Jun 2011
313 Beiträge
 
#6

AW: Frage zur inline Optimierung

  Alt 5. Jun 2012, 16:06
Kommt es denn in allen Situationen so sehr auf Performance an?
  Mit Zitat antworten Zitat
atc

Registriert seit: 3. Dez 2010
17 Beiträge
 
#7

AW: Frage zur inline Optimierung

  Alt 5. Jun 2012, 16:10
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.

Geändert von atc ( 5. Jun 2012 um 16:12 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.580 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Frage zur inline Optimierung

  Alt 5. Jun 2012, 23:13
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  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 02:39 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