gritsch schrieb:
trenne doch mal das laden und das grafische darstellen komplett.
dann siehst du ja auch welcher der beiden teile viel zeit benötigt.
1. ein Breakpoint und Zeitstempel in makeWindowControllers zeigt, dass die allermeiste Zeit beim Umwandeln verbraten wird. Bevor etwas gezeichnet wird. Außerdem wird zunächst auch nur eine von 50 geladenen Seiten angezeigt. Blättern zwischen Seiten ist nicht erkennbar langsam, also unter 0.1 Sekunden
2. der XML-Parser braucht insgesamt ca. 0.5 Sekunden. D.h. libxml2 würde das nicht wesentlich beschleunigen.
3. das Langsame ist das Umwandeln. Und dass es so lang dauert liegt daran, dass ich einen eigenen setNeedsDisplay + Caching-Mechanismus habe, der ähnlich wie eine NSView-Heierarchie arbeitet, aber auf meinen CAD-Objekten. Z.B. muß man ein Kreis neu gemalt werden, wenn sich seine Größe ändert. Das mußt er allen darüberliegenden Objekten und dem echten NSView mitteilen. Das geht per Rekursion durch den Objektbaum. D.h. wenn ich Dummy-Objekte anlege wird es natürlich schneller werden, verliert aber die Funktion, so dass es mir auch nichts sagen wird.
4. NSNumber nehme ich in COUNT_M() nur, um möglichst einfach die Anzahl der Methodencalls in einem Code-Block zu zählen, aber nicht um irgendwie die absolute Rechenzeit zu bestimmen.
Im Prinzip ist das Problem sehr ähnlich wie wenn man 60000 NSViews hat und die effizient malen will. Dann muß man mit setNeedsDisplay arbeiten, damit das Malen von einem gegebenen Ausschnitt auch nur den wirklich veränderten Anteil neu malt.
Ws Du mit mehreren Threads meinst ist mir nicht klar und wie das die Zeit von Programmstart bis zur Anzeige des Fensters mit der ersten Seite beschleunigen soll. Der Rechnaufwand ist der gleiche und Anzeigen kann ich erst wenn alles geladen ist (weil die Daten Abhängigkeiten haben die oft erst in der letzten Zeile aufgelöst werden). Das Einzige wo ich eine Möglichkeit sehe ist dass das Umwandeln zunächst nur meine Objekte anlegt und nur eine Referenz auf den XMLNode speichert. Und erst wenn man ein Objekt zum ersten Mal anzeigen will oder sonst irgendwie seine Daten braucht, wird es aus XML gewandelt. Dann zerhacke ich das Laden von 50 Seiten ggf. auf 50 Einzelschritte wenn der User durch eine Seite nach der anderen blättert.
Aber ich glaube jetzt kommen wir vom Thema "Debugging-Methoden" zu "Softwarearchitektur"... Also vom optimalen Werkzeug (und das war ja meine Frage) zum konkreten Problem.