AGB  ·  Datenschutz  ·  Impressum  







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

Doppel schnell aus Liste löschen.

Ein Thema von Bjoerk · begonnen am 7. Dez 2014 · letzter Beitrag vom 14. Dez 2014
Antwort Antwort
Dejan Vu
(Gast)

n/a Beiträge
 
#1

AW: Doppel schnell aus Lise löschen.

  Alt 8. Dez 2014, 16:31
Schau Dir mal meine Vorschläge an:
http://www.delphipraxis.net/1282576-post8.html

Ob einfache Schleife plus Quicksort schneller ist als Summe N Durchläufe wage ich allerdings zu bezweifeln. Ich lass es aber jetzt erst mal so. Von Hashmaps hab ich leider keine Ahnung und auch leider Keine Zeit weiter hieran zu arbeiten. Thanx!
Na, ich würde nicht wagen, das zu bezweifeln, sondern belegen, das es langsamer ist.

Ich werde heute abend mal ein paar benchmarks posten.
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Doppel schnell aus Lise löschen.

  Alt 8. Dez 2014, 17:37
Ok. Aber nur wenn du Zeit und Lust hast. Möchte das Thema auch nicht überstrapazieren? Hier (Auszug zusammenkopiert).
Angehängte Dateien
Dateityp: zip uFloatPoints.zip (1,4 KB, 5x aufgerufen)
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#3

AW: Doppel schnell aus Lise löschen.

  Alt 8. Dez 2014, 18:54
So, das hier ist 20x(*) schneller als deine Methode.
Delphi-Quellcode:
Procedure TFloatPoints.FastRemoveDoubles;
Var
  i,j : Integer;

Begin
  sort;
  j := 0;
  for i:=1 to Count-1 do
    if not SameFloatPoint(Fitems[i],FItems[j]) then begin
      inc(j);
      Fitems[j] := fItems[i];
    End;
  FCount := j;
End;
Die Variante mit der Hashmap hab ich mir geschenkt. Da dürften erst bei > 1 Mio spürbare Unterschiede auffallen: Quicksort ist ja schön schnell.

Davon abgesehen ist auch in 'AddPoints' noch mächtig Luft nach oben.
Delphi-Quellcode:
procedure TFloatPoints.FastAddPoints(Value: TFloatPoints);
var
  newCount, newCapacity : integer;

begin
  newCount := Self.Count + Value.Count;
  if newCount = Self.Count then exit;
  while fCapacity < newCount do fCapacity := fCapacity + DeltaCapacity;
  SetCapacity(fCapacity);
  Move(value.FItems[0],FItems[Count+1], value.Count*SizeOf(value[0]));
  self.FCount := newCount;
end;
Den Rest habe ich mir nicht mehr angeschaut, aber ich frage mich, wieso Du die Quellen von TList kopiert hast, wo Du doch dein TFloatPoint einfach in eine TList packen kannst. Dann kannst du dir das ganze Gedöns sparen. Na ja. Mach wie Du denkst.


(*) 20x bei 100.000 Elementen. Sind es mehr, ist der Unterschied noch drastischer. Sind es weniger, dann ist der Unterschied auch nicht mehr so hoch.

Geändert von Dejan Vu ( 8. Dez 2014 um 19:40 Uhr) Grund: Zusatz für 20x.... Denn bei 1 Mio Elementen dürfte das 100x schneller sein(?)
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Doppel schnell aus Lise löschen.

  Alt 8. Dez 2014, 19:30
Nicht schlecht. Aber, was soll das if newCount = Self.Count then exit in der FastAddPoints?
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#5

AW: Doppel schnell aus Lise löschen.

  Alt 8. Dez 2014, 19:37
Nicht schlecht. Aber, was soll das if newCount = Self.Count then exit in der FastAddPoints?
Na, wenn es nix zu tun gibt, dann tschüss.
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Doppel schnell aus Lise löschen.

  Alt 8. Dez 2014, 20:09
Das soll doch analog AddStrings sein. Die Zeile muß natürlich raus.
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#7

AW: Doppel schnell aus Lise löschen.

  Alt 8. Dez 2014, 20:45
Ok. Die Sleep-Anweisungen von Himitsu rein und dafür die Abfrage, ob es etwas zu tun gibt, raus.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Doppel schnell aus Lise löschen.

  Alt 8. Dez 2014, 19:33
Das Verhalten von Capacity und blockweiser Vergrößerung ist doch bereits im TList eingebaut?
PS: TList.Insert

So, das hier ist 20x schneller als deine Methode.
Da müssen dringend ein paar Sleep in den Code, denn es soll ja nur doppelt so schnell werden!
Ein Therapeut entspricht 1024 Gigapeut.
  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 16:51 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz