AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi ASM - Compiler erstellt überflüssigen Code?
Thema durchsuchen
Ansicht
Themen-Optionen

ASM - Compiler erstellt überflüssigen Code?

Ein Thema von dizzy · begonnen am 25. Feb 2005 · letzter Beitrag vom 25. Feb 2005
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#1

ASM - Compiler erstellt überflüssigen Code?

  Alt 25. Feb 2005, 14:43
Spät-Mahlzeit!

Es ist zwar nur eine klitze Kleinigkeit, aber ich habe mich gerade beim Durchsteppen im CPU-Fenster etwas gewundert. Die im Bild (im Anhang) rot umrandete Zeile dürfte ja eigentlich nie erreicht werden, da direkt zuvor ein ret steht (der auch zum sofortigen Sprung führt, klar). Die Zeile wird tatsächlich nie erreicht - die Unit ist recht klein, und ein komplettes Durchsteppen landete nicht ein mal dort.
Warum aber existiert diese Zeile dann? Sie gehört auch nicht zur Folgeprozedur. Sie wird folglich nicht benötigt, und belegt nur Plattenplatz + RAM.
Das ist für eine einzige Anweisung zwar Lachhaft, ich weiss, aber ich frage mich wie viel es wohl in größeren Projekten ausmachen könnte. Ist da etwa noch offensichtliches Optimierungspotential im Compiler? Oder ist das ganz besonders schlau von Delphi, weil damit evtl. günstigeres Alignment erreicht wird? Kein Plan. Aber Interesse dran!

Ich weiss dass das ziemlich kleinlich klingt, aber irgendwie stört es mich grad .
Miniaturansicht angehängter Grafiken
warum_306.gif  
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Benutzerbild von retnyg
retnyg

Registriert seit: 12. Feb 2005
193 Beiträge
 
#2

Re: ASM - Compiler erstellt überflüssigen Code?

  Alt 25. Feb 2005, 14:53
es handelt sich wahrscheinlich um eine variable, die der compiler an den prozedur code anhängt.
dass da LEA EAX... steht ist reiner zufall da der wert halt dieser anweisung entspricht

btw.. seit wann hast du das matrix-zeuch in deinem logo ?
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#3

Re: ASM - Compiler erstellt überflüssigen Code?

  Alt 25. Feb 2005, 14:54
Zitat von dizzy:
weil damit evtl. günstigeres Alignment erreicht wird?
Warum fragst du, wenn du es dir selbst doch erklären kannst.
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#4

Re: ASM - Compiler erstellt überflüssigen Code?

  Alt 25. Feb 2005, 14:56
Zitat von retnyg:
es handelt sich wahrscheinlich um eine variable
Mit 3 Bytes? Die nächste Funktion beginnt bei einer durch 8 bzw. 4 teilbaren Adresse.
  Mit Zitat antworten Zitat
Benutzerbild von retnyg
retnyg

Registriert seit: 12. Feb 2005
193 Beiträge
 
#5

Re: ASM - Compiler erstellt überflüssigen Code?

  Alt 25. Feb 2005, 14:57
Zitat von jbg:
Zitat von retnyg:
es handelt sich wahrscheinlich um eine variable
Mit 3 Bytes? Die nächste Funktion beginnt bei einer durch 8 bzw. 4 teilbaren Adresse.
vielleicht verwendet er in seinem source 3 variablen vom typ byte ?
edit: oder ein Word und das 00 noch angehängt um auf die schöne durch 4 teilbare addy zu kommen...
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#6

Re: ASM - Compiler erstellt überflüssigen Code?

  Alt 25. Feb 2005, 14:59
Das ist schon eine nahezu perfekte Optimierung. Die umrahmten Bytes sind einfach da, das ist Absicht. Die nächste Anweisung ist so an einer DWORD-Adresse, was Sprünge oder Calls einen Speedvorteil bringen kann. Mach mal einen Test: Nimm dir die Funktion
Delphi-Quellcode:
procedure Test;
asm
  nop
  inc eax
  ret
end;
Und teste sie durch, indem du einmal CALL Test aufrufst und im anderen Fall eben so:
Delphi-Quellcode:
asm
  lea edx, Test
  inc edx
end;
// Weiterer Testcode
asm
  call edx
end;
Beides führt den selben Code aus, aber nur CALL Test wird direkt eine DWORD-Adresse aufrufen. Dürfte also schneller sein

PS: Ich hab's nicht getestet. Noch nicht

@retnyg: Wenn es Variablen wären (die drei umrahmten Bytes), müsste das Programm schreibrechte auf die Daten um EIP haben. Ist aber nicht der Fall, also können es keine Variablen sein.
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: ASM - Compiler erstellt überflüssigen Code?

  Alt 25. Feb 2005, 15:00
@jbg: Das war nur eine völlig geratene Vermutung. Ob das überhaupt von Belang wäre weiss ich ja nichtmal

@retnyg: Hmmm, das könnte an sich sein. Jedoch würde ich eher Konstanten in dieser Form erwarten, und solche kommen in beiden Prozeduren nicht vor (zumindest keine die diesem Wert entsprächen). Zudem sind es alles lokale Variablen (die ja auf dem Stack rumlungern dürften ), womit ein Pointer auf einen Wert auch nicht allzu plausibel erscheint. Aber an sich klingt das nach einer wahrscheinlichen Sache...

Die beiden zugerörigen Prozeduren mal in DL:
Delphi-Quellcode:
function FillZero(const s: String; const count: Integer): String;
var
  oldL: Integer;
  i : Integer;
begin
  oldL := Length(s);
  SetLength(result, count);
  for i := 1 to count-oldL do
    result[i] := '0';
  for i := count-oldL+1 to count do
    result[i] := s[i-count+oldL];
end;

// <-----------

procedure TfrmVorlage.FillVerfuegbar;
var
  s: array[0..7] of String;
begin
  lbVerfuegbar.Items.Clear;
  QryVerfuegbar.First;
  while not QryVerfuegbar.Eof do
  begin
    s[0] := QryVerfuegbar.FieldValues['N00'];
    s[1] := QryVerfuegbar.FieldValues['N01'];
    s[2] := QryVerfuegbar.FieldValues['N02'];
    s[3] := QryVerfuegbar.FieldValues['N03'];
    s[4] := QryVerfuegbar.FieldValues['EArt'];
    s[5] := QryVerfuegbar.FieldValues['Def'];
    s[6] := QryVerfuegbar.FieldValues['N04'];
    s[7] := QryVerfuegbar.FieldValues['Text'];

    lbVerfuegbar.Items.Add(FillZero(s[0], 2) + '-' +
                           FillZero(s[1], 2) + '-' +
                           FillZero(s[2], 2) + '-' +
                           FillZero(s[3], 2) + '-' +
                           s[4] + '-' +
                           s[5] +
                           FillZero(s[6], 4) + ' ' +
                           s[7]);
    QryVerfuegbar.Next;
  end;
end;
Die betreffende ASM-Zeile steht quasi zwischen diesen beiden Prozeduren, beim Pfeil.

\\EDIT: @Dax : Also tatsächlich wirklich Alignment... ist ja nen Dingen! Hat das wirklich merkbaren Einfluss auf die Geschwindigkeit? Ich hatte hier mal irgendwo soetwas gelesen, allerdings in Bezug auf Datenalignment und den Zugriff darauf. (Wobei ein Call ja eigentlich nix anderes ist. Sitmmt schon... )
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Benutzerbild von retnyg
retnyg

Registriert seit: 12. Feb 2005
193 Beiträge
 
#8

Re: ASM - Compiler erstellt überflüssigen Code?

  Alt 25. Feb 2005, 15:04
Zitat von Dax:
@retnyg: Wenn es Variablen wären (die drei umrahmten Bytes), müsste das Programm schreibrechte auf die Daten um EIP haben. Ist aber nicht der Fall, also können es keine Variablen sein.
schreibrechte im EIP ? wie werden diese erteilt ? habe davon noch nie was gehört...wäre nett wenn du dazu mal etwas mehr sagen könntest
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#9

Re: ASM - Compiler erstellt überflüssigen Code?

  Alt 25. Feb 2005, 15:06
Ich bastele schon ein paar Wochen an einer Möglichkeit, Schreibrechte auf's Codesegment zu bekommen, bis jetzt hatte ich keinen Erfolg
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#10

Re: ASM - Compiler erstellt überflüssigen Code?

  Alt 25. Feb 2005, 15:07
Zitat von retnyg:
vielleicht verwendet er in seinem source 3 variablen vom typ byte ?
Vielleicht, aber Variablen liegen nicht im CodeSegment (Readable, not Writable, Executable), sondern im Datensegment (Readable, Writeable, not Executable). Denn was bringt einem eine nicht beschreibbare Variable? Das kann höchstens eine Konstante sein, und die liegt gewiss nicht an dieser Stelle, sondern vereint bei allen anderen Konstanten.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 03:10 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