Forenindex » Programmierung/Entwicklung » AppleScript » OS X und XPress: Scriptausführung beschleunigen

OS X und XPress: Scriptausführung beschleunigen

Hans Haesler
  
Beiträge gesamt: 5826

25. Feb 2004, 17:43
Bewertung:

gelesen: 850

Beitrag als Lesezeichen
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
Code
… werden alle Namen in eine Liste geschrieben. Das Script geht die Liste durch. Erst wenn ein Name mit dem vorgegebenen übereinstimmt, wird der Absatz direkt angefragt: 

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ü.

Hans Haesler <hsa@ringier.ch>

OS X und XPress: Scriptausführung beschleunigen

Anonym
Beiträge gesamt: 22827

25. Feb 2004, 23:58
Bewertung:

gelesen: 849

Beitrag als Lesezeichen
Hallo Hans,
ohne dir zu nahe treten zu wollen:

"halbgare" aus dem Zusammenhang gerissene Code-Snippets bringen m. E. wenig.

Könntest du eine Test-Datei nebst entsprechendem Script bereitstellen?

Karsten

OS X und XPress: Scriptausführung beschleunigen

Hans Haesler
  
Beiträge gesamt: 5826

26. Feb 2004, 09:22
Bewertung:

gelesen: 849

Beitrag als Lesezeichen
Hallo Karsten,

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.

Hans Haesler <hsa@ringier.ch>

OS X und XPress: Scriptausführung beschleunigen

Hans Haesler
  
Beiträge gesamt: 5826

27. Feb 2004, 17:34
Bewertung:

gelesen: 849

Beitrag als Lesezeichen
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):
Code
set theParas to (index of every paragraph whose length > 1 and name of style sheet is styleSheetName) 

In die Bedingung wird gleichzeitig die Anzahl Zeichen gegeben (mehr als 1). Somit entfällt der ursprüngliche Test &#133;
Code
if (count of characters) > 1 then 

&#133; 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 &#133;

Danke Karsten!

Ich werde nach meiner Rückkehr aus dem Skiurlaub versuchen, weitere Steigerungen zu erzielen.

Hans Haesler <hsa@ringier.ch>