Erst mal was einfaches, was keinen Einfluss auf die Geschwindigkeit hat.
Das
Int64($7FFFFFFFFFFFFFFF); geht auch einfacher und ohne Magic Number
High(Int64);
Das Record
TRGB ist nicht packed. Wenn du Alignment aktiviert hast, was standard der Fall ist, dann ist es in Wirklichkeit 4 Byte groß. Also für Dateien oder dierkten Speicherzugriff nur mit Vorsicht zu genießen.
Zu dem Algirithmus: Die Beste Optimierung ist, unnötige Dinge gar nicht erst auszuführen. So solltest du dir gut überlegen wie du den Code so umstellen kannst, dass keine doppelte Arbeit statt findet. Du vergleichst ein Bild mit allen anderen Bildern? Sehe ich das Richtig? Wenn ja, dann kannst du einiges an Zeit sparen, wenn du das aktuelle Bild nur mit den nachfolgenden Vergleichst. Kleines Beispiel mit 3 Bildern. Du vergleichst 1 mit 2 dann 1 mit 3. Wenn du jetzt 2 vergleichen willst, dann brauchst du es mit 1 nicht mehr vergleichen. Denn das wurde bereits bei dem ersten Bild verglichen. Also Musst du es nur noch mit 3 vergleichen. Sofern mein Kaffee heute schon ausreichend dosiert wurde.
Dann solltest du dir evtl mal in der CPU Ansicht anschauen was der Kompiler aus deiner Schleife gemacht hat. Delphi optimiert sicher einiges aber ich denke [i]Catalogs[CatID].PicInfoList
.RefPoints[j, k]. wird er nicht hin bekommen. Der erste Teil dieser Zeile verändert sich nicht. Da solltest du entweder mit with [i]Catalogs[CatID].PicInfoList
do arbeiten oder dir einen Pointer auf die Objekte holen.
Aber ich denke du solltest dir auch mal anschauen wo die meiste Zeit drauf geht. Also entweder über den High Performance Counter messen welche ausgewählt stelle wie viel Zeit benötigt. Oder mit einem Profiler (z.B.: aqTime) mal schauen. Von aqTime gibt es eine 30 Tage Testversion. Allerings wäre es da evtl auch ganz interessant zu sehen wie häufig das ein oder andere aufgerufen wird. Das geht aber nicht wenn alles in einer Methode ist. Da dann evtl mal kurzzeitig auslagern etc.
PS: Könnte es etwas bringen die AffinityMask der Threads entsprechend zu setzen? Denn sonst springen die Threads zwischen den Kernen hin und her. Evtl entlastet das auch deren Cache.
PPS: Gehört diese Frage nicht auch eher in ein neues Thema??