Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Merkwürdig ... oder ein Fehler meinerseits? (https://www.delphipraxis.net/86410-merkwuerdig-oder-ein-fehler-meinerseits.html)

AlphaBug 13. Feb 2007 20:09


Merkwürdig ... oder ein Fehler meinerseits?
 
Hallo,

ich habe eine eigene Variante der VCL-Klasse TList namens TgeBaseList erstellt.
Diese Klasse wollte ich erweitern und optimieren.

Dabei habe ich mir auch die Klasse TPersistentObjectList aus dem GLScene-Package angesehen.
In der Hilfe von GLScene wird angegeben, dass die Implementierung der IndexOf-Funktion der Klasse TPersistentObjectList bis zu drei mal schneller sei, als Die der TList-Klasse.

Nun habe ich den Quellcode der Funktion in meine Klasse "übernommen".

Wenn ich jetzt Zeitmessungen durchführe muss ich jedoch feststellen, dass Sie nicht schneller sondern langsamer ist :gruebel: als die TList.

Hier mein (schnellerer) Code
(Wird so auch in TList verwendet):
Delphi-Quellcode:
function TgeBaseList.IndexOf(Item: gePointer): geInteger;
begin
  Result := 0;
  while (Result < Self.fCount) and
        (Self.fList^[Result] <> Item) do
    System.Inc(Result);
  if (Result = Self.fCount) then
    Result := (-1);
end;
Hier der Code aus GLScene
(der angeblich bis zu 3x so schnell sei):
Delphi-Quellcode:
function TPersistentObjectList.IndexOf(Item: TObject): Integer;
var
  c : Integer;
  p : ^TObject;
begin
  if FCount<=0 then
    Result:=-1
  else begin
    c:=FCount;
    p:=@FList^[0];
    asm
        mov eax, Item;
        mov ecx, c;
        mov edx, ecx;
        push edi;
        mov edi, p;
        repne scasd;
        je @@FoundIt
        mov edx, -1;
        jmp @@SetResult;
      @@FoundIt:
        sub edx, ecx;
        dec edx;
      @@SetResult:
        mov Result, edx;
        pop edi;
    end;
  end;
end;
Daraus habe ich dann eine Umsetzung komplett in Assembler erstellt
(die aber langsamer ist als die Delphi-Variante von TList):
Delphi-Quellcode:
function TgeBaseList.IndexOf(Item: gePointer): geInteger;
{ EAX=Self EDX=Item ; Result=EAX }
asm
    PUSH EDI
    {EDI := @fList^[0];}
    MOV ECX, TgeBaseList(EAX).fList
    LEA EDI, [ECX]
    {ECX is Counter}
    MOV ECX, TgeBaseList(EAX).fCount
    {EAX := Item}
    MOV EAX, EDX
    {EDX is Result-Buffer}
    MOV EDX, ECX
    {Scan for Item}
    REPNE SCASD
    JE @@Found
    { not Found -> Result := -1 }
    MOV EDX, -1
    JMP @@Done
  @@Found:
    SUB EDX, ECX
    DEC EDX
  @@Done:
    MOV EAX, EDX
    POP EDI
end;

Kann mir das jemand erklären?
Habe ich vielleicht etwas falsch gemacht?

DP-Maintenance 13. Feb 2007 20:37

DP-Maintenance
 
Dieses Thema wurde von "Christian Seehase" von "Programmieren allgemein" nach "Sonstige Fragen zu Delphi" verschoben.
Ein Delphi-Problem

sirius 14. Feb 2007 08:35

Re: Merkwürdig ... oder ein Fehler meinerseits?
 
Sieht ja soweit alles gut aus.

Vielleicht kommt dein Prozessor beim Pipelining mit einer Repeat-Schleife ins Stottern.

Edit: Hast du mal getestet, ob die Variante ab einer bestimmten Listenlänge besser ist?

Luckie 14. Feb 2007 09:09

aussagekräftiger Titel
 
Bitte gib deinem Thread einen aussagekräftigen Titel. Danke.


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