AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein [Assembler]: 2 Variabeln austauschen
Thema durchsuchen
Ansicht
Themen-Optionen

[Assembler]: 2 Variabeln austauschen

Ein Thema von St.Pauli · begonnen am 10. Aug 2006 · letzter Beitrag vom 11. Aug 2006
Antwort Antwort
Seite 2 von 2     12   
jbg

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

Re: [Assembler]: 2 Variabeln austauschen

  Alt 11. Aug 2006, 01:42
Zitat von NamenLozer:
Öhm, was bewirkt eigentlich Inline?
Es bewirkt, dass der Compiler statt eines Funktionsaufrufes gleich die ganze Funktion an der Aufrufstelle einfügt.

Zitat:
Kann man das bei jeder Methode verwenden?
Können schon, nur ist der Compiler etwas wählerisch. Und wenn man alles als Inline deklariert, hast du am Schluss (theoretisch) Code produziert, bei dem jeder Funktion zig tausendfach vorhanden ist. Über die Exe-Dateigröße will ich da erst gar nicht nachdenken. Das aber nur theoretisch, weil der Compiler nicht alles inlinen kann/will.

Zitat:
Bringt es bei jeder Methode inen Geschwindigkeits-Boost?
Nein. Es kann sogar den gegenteiligen Effekt haben, weil dem Register-Allocator die freien Register ausgehen und der Compiler dann Code generiert der nur noch mit push und pop beschäftigt ist. Ruft man hingegen eine Funktion auf, so stehen dem Register-Allocator wieder alle Register zur Verfügung.

Hier mal ein Auszug aus meinem Code aus den Indy-Komponentnen (IdGlobal.pas). Würden die lokalen Find() und FindNext() ge-inlined wäre der Code um ein ganzes Stück langsamer, weil der Compiler das ESI Register im Inline-Code nicht verweden kann und somit bei jedem Schleifendurchlauf den PChar-Zeiger neu aus dem Speicher einliest und danach wieder dorthin schreibt (2 Speicherzugriffe mehr pro Schleifendurchlauf).
Delphi-Quellcode:
function PosIdx(const ASubStr, AStr: AnsiString; AStartPos: Cardinal): Cardinal;

  // use best register allocation on Win32
  function Find(AStartPos, EndPos: Cardinal; StartChar: AnsiChar; const AStr: AnsiString): Cardinal;
  begin
    for Result := AStartPos to EndPos do
      if AStr[Result] = StartChar then
        Exit;
    Result := 0;
  end;

  // use best register allocation on Win32
  function FindNext(AStartPos, EndPos: Cardinal; const AStr, ASubStr: AnsiString): Cardinal;
  begin
    for Result := AStartPos + 1 to EndPos do
      if AStr[Result] <> ASubStr[Result - AStartPos + 1] then
        Exit;
    Result := 0;
  end;

var
  StartChar: AnsiChar;
  LenSubStr, LenStr: Cardinal;
  EndPos: Cardinal;
begin
  if AStartPos = 0 then
    AStartPos := 1;
  Result := 0;
  LenSubStr := Length(ASubStr);
  LenStr := Length(AStr);
  if (LenSubStr = 0) or (AStr = '') or (LenSubStr > LenStr - (AStartPos - 1)) then
    Exit;

  StartChar := ASubStr[1];
  EndPos := LenStr - LenSubStr + 1;
  if LenSubStr = 1 then
    Result := Find(AStartPos, EndPos, StartChar, AStr)
  else
  begin
    repeat
      Result := Find(AStartPos, EndPos, StartChar, AStr);
      if Result = 0 then
        Break;
      AStartPos := Result;
      Result := FindNext(Result, AStartPos + LenSubStr - 1, AStr, ASubStr);
      if Result = 0 then
      begin
        Result := AStartPos;
        Exit;
      end
      else
        Inc(AStartPos);
    until False;
  end;
end;
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#12

Re: [Assembler]: 2 Variabeln austauschen

  Alt 11. Aug 2006, 14:37
Vielen dank
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 22:36 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