Um noch eine letzte Rückmeldung zu geben - für den Fall, dass es noch einen interessiert - inzwischen ist auch die letzte Bremse beseitigt.
Kurzer Hintergrund: Die Anwendung plant an Hand von BoundingBoxen die Verteilung von Anzeigen innerhalb eines Katalogs. Dabei stehen verschiedene Anzeigen in einer Beziehung zueinander und müssen nach bestimmten Regeln auf gleichen, vorhergehenden oder nachfolgenden Doppelseiten platziert werden. Die Daten kommen als
XML an, werden verarbeitet und es wird
XML wieder weggeschrieben.
Um verschiedenste Umbruchvarianten durchzuprobieren, werden baumartig verschiedene Umbruchzweige geöffnet und die Anzeigen (da sie innerhalb jeder Umbruchvariante angepackt und mit Zusatzdaten versehen werden) geklont. Um es kurz zu machen: Die Anwendung klont wie wahnsinnig und erzeugt viele, viele, viele, viele Objekte.
Innerhalb des Klonens einer Anzeige gab es ein letztes Problem:
- Zu einer Anzeige gibt es Schnittkanten. Diese Schnittkanten geben vor, wo eine Anzeige zerteilt werden darf, um in mehreren Blöcken auf der Seite zu erscheinen
- Die Schnittkanten werden bei der Erzeugung des Objektes durch Analyse des übergebenen XML erzeugt
Also etwa:
Code:
TUmbrObjekt.Create (
XML: IXMLDOMNode );
begin
[...]
AnalyzeXml (
XML ); // Analyse des uebergebenen
XML
[...]
end;
Die Methode AnalyzeXML ist dann dafür zuständig, dass die entsprechenden Unterobjekte, welche die einzelnen Schnittkanten repräsentieren, erzeugt werden.
Grob gesagt (handelt sich hier um eine extreme Vereinfachung) habe ich also ein Objekt folgenden Aufbaus:
Code:
TUmbrObjekt = class
[...]
private
FXML: IXMLDOMNode; // Hier wird das
XML der Initialisierung vorgehalten
FSchnittkanten: Array Of TSchnittkante;
[...]
end;
Das Objekt kann sich selbst aber auch klonen. Und dabei bin ich folgendermaßen vorgegangen:
Code:
function TUmbrObjekt.Clone: TUmbrObjekt;
var
i: Integer;
begin
Result := TUmbrObjekt.Create ( FXML );
for i := 0 to High ( FSchnittkanten ) do begin
// self.FSchnittkanten[i] an Result anhängen
end;
end;
Und genau darin lag der Fehler: Sowohl im Create werden Schnittkanten durch das
XML erzeugt, als auch während des Klon-Vorgangs zusätzlich noch einmal an den Klon angehängt. Auf diese Weise habe ich die Anzahl der Unterobjekte explosionsartig vermehrt.
Nachdem ich das aufgeräumt hatte, konnte ich die Bearbeitungszeit dramatisch verkürzen. Aus den ursprünglichen knapp 80 Minuten wurden bei gleichen Daten 1,5 Minuten. Mit dem Gesamtdatenbestand, der letzten Endes einen Katalog von etwa 800 Seiten erzeugt, schrumpfte die Bearbeitungszeit von über 4 Stunden auf 5 Minuten.
Vielen Dank für die Hilfe!!!!