AGB  ·  Datenschutz  ·  Impressum  







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

Codeoptimierung lieber abschalten

Ein Thema von Michael Ebner · begonnen am 3. Jan 2023 · letzter Beitrag vom 9. Jan 2023
Antwort Antwort
Seite 3 von 3     123   
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#21

AW: Codeoptimierung lieber abschalten

  Alt 4. Jan 2023, 18:01
Ohne einen Beleg dafür ist das nur Angstmacherei.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.942 Beiträge
 
Delphi 12 Athens
 
#22

AW: Codeoptimierung lieber abschalten

  Alt 4. Jan 2023, 18:15
Einfach noch eine Config hinzufügen?

Release
Debug (wie Release, nur ohne Debuginfos)

Und dann kann man nochmal davon ableiten und Varianten mit/ohne Codeoptimierung hinzufügen,
oder, wie bereits erwähnt, dann das wenigstens in beiden Configs abschalten, damit man auch das debuggt, was auch der Kunde bekommt.

Alternativ mit externen Debuginfos kompilieren ... jenachdem ob die Debuginfodateien (TDS) daneben liegen, ist es mit oder ohne, aber die Programmdateien selber sind immer identisch.
Eine andere Alternative wäre, diese defines in eine Include Datei zu packen und diese per {$I MeineIncludeDatei.inc} in jeder Unit einzubinden.
Dann könnte man es wieder zentral ein/ausschalten.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

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

AW: Codeoptimierung lieber abschalten

  Alt 4. Jan 2023, 18:45
Ich meine gehört zu haben , dass im Optimierungsfalle Schleifen ggf. in die andere Richtung abgearbeitet werden, was zu 'Seiteneffekten' führen kann.
Ohne einen Beleg dafür ist das nur Angstmacherei.
Das ist keine Angstmacherei, das ist wirklich so. Das ist aber auch kein Problem und nur im generierten Assemblercode sichtbar, da das nur passiert, wenn man die Schleifenvariable nicht verwendet. Beispiel:
Delphi-Quellcode:
procedure Test;
var
  i: Integer;
begin
  for i := 0 to 9 do
    ShowMessage(1.ToString);
end;
Der generierte Code sieht so aus:
delphiloop.png

//EDIT:
Ach ja, wenn man im Assemblercode nicht die Variable, sondern das Register anspricht, kommt man auch dran. Das kann jeder mit Optimierung testen:
Delphi-Quellcode:
procedure Test;
var
  i, b: Integer;
begin
  for i := 0 to 9 do
  begin
    asm
      mov b, ebx
    end;
    ShowMessage(b.ToString);
  end;
end;
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!

Geändert von jaenicke ( 4. Jan 2023 um 18:52 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#24

AW: Codeoptimierung lieber abschalten

  Alt 4. Jan 2023, 19:23
Das ist keine Angstmacherei, das ist wirklich so. Das ist aber auch kein Problem und nur im generierten Assemblercode sichtbar, da das nur passiert, wenn man die Schleifenvariable nicht verwendet.
Ich weiß. Die Angstmacherei bezog sich auch eher auf das "Ich meine gehört zu haben" und "was zu 'Seiteneffekten' führen kann". Die Rückwärtsschleifen kommen ja nur dann zum tragen, wenn es eben keine unerwünschten Seiteneffekte dabei gibt.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#25

AW: Codeoptimierung lieber abschalten

  Alt 4. Jan 2023, 20:12
Ich meine gehört zu haben , dass im Optimierungsfalle Schleifen ggf. in die andere Richtung abgearbeitet werden, was zu 'Seiteneffekten' führen kann.
Ja, die zählen manchmal rückwärts auf 0 runter, aber beim Zugriff wird das umgerechnet und schon stimmt es wieder.

Egal, ob aus dem
Delphi-Quellcode:
for i := 1 to 9 do
  Write(i);
der Compiler das macht.
Delphi-Quellcode:
for i := 8 downto 0 do
  Write(9 - i);
Am Ende kommt das Gleiche bei raus.

Aber kommt wer auf die saudumme Idee nach der Schleife auf i zugreifen zu wollen, dann ist er selbst Schuld.



@jaenicke:
Mit 64 Bit stirbt der Inline-Assembler eh aus.
Und wenn i mal nicht in ebx liegt, dann hat dein Code eh ein Problem.
Wenn du im Assembler auf "i" zugreifst, dann weiß der Compiler in welchem Register/Stack die Variable liegt und dass hier nicht optimiert werden kann/soll.

Auch mit Pointern kann man da Mist bauen.
Delphi-Quellcode:
for i := 0 to 9 { step 2 } do begin
  ShowMessage(i.ToString); // 0 2 4 6 8
  Inc(PInteger(@i)^);
end;
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 4. Jan 2023 um 20:20 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.798 Beiträge
 
Delphi 12 Athens
 
#26

AW: Codeoptimierung lieber abschalten

  Alt 5. Jan 2023, 11:30
Ohne einen Beleg dafür ist das nur Angstmacherei.
Daher meine knappe Anmerkung in #4: FUD

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.016 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#27

AW: Codeoptimierung lieber abschalten

  Alt 9. Jan 2023, 13:16
Ich korrigiere mal einige Aussagen bezüglich "rückwärts zählende Schleifen".

Sofern die Zählvariable innerhalb des Schleifenrumpfes benutzt wird, fügt der Compiler zusätzlich zu der Zählvariable, welche sich im korrekten Wertebereich bewegt zusätzlich eine Variable ein, die er nutzt, um auf 0 runter zu zählen. Diese wird aber nicht wie etwa von Himitsu skizziert für irgendetwas anderes genutzt als für den Schleifen Code an sich. Interessanterweise passiert dies in dem geposteten Code nicht mal, sondern nur, wenn lower und/oder upper bound variabel sind.

Das auf 0 runter zählen ist eine gängige Optimierung da hierbei nach dem Dekrement direkt ein bedingter Sprungbefehl stehen kann, anstatt zuerst einen Vergleich auf die obere Grenze - je nachdem wie viele Register für den Code gebraucht werden, kann das aber auch eher nachteilig sein, gerade unter 32bit hat man nur eine Handvoll davon.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie ( 9. Jan 2023 um 13:39 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


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 23:02 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