Verschiedentlich wurde gemeldet, dass die Ausführung von QuarkXPress-Scripts unter Mac OS X erheblich länger dauert. Es ist zwar allgemein bekannt, dass Scripts unter QXP 3.32 am fixesten laufen. Und es ist auch logisch, dass das Ausführen beim Ansprechen der immer schwerfälliger werdenden Versionen auch darunter leidet.
Einen Teil der Schuld muss man sicher auch dem langsameren Mac OS X zuschieben. Aber was kann man tun, um Scripts zu optimieren?
Hier ein konkretes Beispiel: Es geht darum, in einem Projekt die Textboxen nach Absätzen zu durchforschen, welche mit einer bestimmten Stilvorlage formatiert sind. Sobald eine Übereinstimmung gefunden ist, wird die Position der Grundlinie notiert, sowie die Anzahl Zeilen des Absatzes und der Zeilenabstand. Mit diesen Parametern wird hinter der entsprechenden Textbox eine Hintergrundbox erstellt.
Mit QuarkXPress 4.11 geht dieses Abfragen so rasch, dass sämtliche Boxen nach 1,5 Sekunden erzeugt sind (dank 'do script' und OSA Menu). Mac OS 9.2.1, G3/450MHz.
Mit QuarkXPress 6.1 und unter Mac OS X 10.3.2, G4/800MHz muss man sich viel länger gedulden: 18 Sekunden …
Abhilfe: versuchen, das direkte Ansprechen der Absätze zu vermeiden. Statt so … --- repeat with p from 1 to count of paragraphs tell paragraph p set curName to name of style sheet if curName = styleSheetName then set leadVal to leading as millimeter units as real set base1 to baseline of line 1 as real set nLines to (count of lines) - 2 my makeBox() end if end tell end repeat set styleSheetList to name of style sheet of every paragraph repeat with p from 1 to count of styleSheetList set curName to item p of my styleSheetList if curName = styleSheetName then tell paragraph p set leadVal to leading as millimeter units as real set base1 to baseline of line 1 as real set nLines to (count of lines) - 2 end tell my makeBox() end if end repeat --- Damit vermeidet man die unzähligen direkten Anfragen an XPress. Die Ausführungszeit wird auf 7 Sekunden reduziert. Auch hier: mit 'do script' und ab dem XPress-eigenen Script-Menü.
bei obigem Beispiel geht es darum, das Prinzip zu illustrieren: Langsam: Die Absätze der Reihe nach direkt ansprechen und jedes Mal den Namen der Stilvorlage verlangen. Schnell: Das Script geht eine Liste durch (die Namen der Stilvorlagen).
Im ersten Snippet geht die Wiederholschleife mit dem Zähler 'p' die Absätze durch und spricht sie direkt an: 'tell paragraph p'.
Im zweiten Snippet wird zuerst die Liste der Stilvorlagennamen erstellt. Dann geht die Wiederholschleife diese Liste durch, erneut mit dem Zähler 'p': 'repeat with p from 1 to count of styleSheetList'. Dabei wird immer das aktuelle Element in die Variable 'curName' gegeben: 'set curName to item p of my styleSheetList'. Das Wörtchen 'my' hilft, den Zugriff auf die Liste zu beschleunigen. In der nächsten Zeile wird der Name mit dem vorgegebenen verglichen: 'if curName = styleSheetName then'. Und erst wenn er übereinstimmt, wird der Absatz direkt adressiert.
Und warum ist dies schneller? Weil vermieden wird, zwischen Script und XPress unnötige AppleEvents auszutauschen. Das Untersuchen der Liste geschieht im Speicher. Mit XPress 4.11 ist die erste Methode so schnell, dass eine Steigerung nicht unbedingt notwendig ist. Doch wegen der dramatischen Verlangsamung unter Mac OS X muss man darauf achten, die Befehle an XPress auf ein Minimum zu beschränken.
Ich sende Dir gerne eine Test-Datei und das Script. Bitte schicke mir ein privates Mail.
Karsten hat mir einen konstruktiven Vorschlag gemacht: Eine Liste der Indizes der Absätze, welche mit der gegebenen Stilvorlage formatiert sind erstellen (statt eine Liste der Stilvorlagen-Namen): In die Bedingung wird gleichzeitig die Anzahl Zeichen gegeben (mehr als 1). Somit entfällt der ursprüngliche Test … … welcher notwendig ist, um zu vermeiden, dass die Hintergrundboxen auf eventuellen Leerzeilen erzeugt werden.
Die Konstruktion des Codes wird etwas einfacher und direkter. Dies resultiert in einer Beschleunigung der Ausführung: Mit einem reellen Projekt dauert es noch 6.5 Sekunden (statt 8.5). Nicht spektakulär aber immerhin …
Danke Karsten!
Ich werde nach meiner Rückkehr aus dem Skiurlaub versuchen, weitere Steigerungen zu erzielen.