(Info:) (Update:) Der dritte Artikel »Javascript Schleifenoptimierung für Illustrator 2022« erklärt Ihnen die Grundlagen rund um Schleifen, einem der wichtigen Kontrollstrukturen in jeder Programmiersprache. Auch in Adobe Illustrator werden Javascript interpretiert (ausgeführt), jedoch nicht zeitlich optimiert, wie Sie hier sehen werden. Daher ist es bei größeren Schleifen besonders wichtig, die schnellste Art zu wählen. Dieser Artikel deckt auch das Verhalten älterer Versionen von Adobe Illustrator ab.
(Hilfe:) Sie wollen oder können nicht selbst programmieren? Sie brauchen kurzfristig ein Javascript für eine Automatisierung für ein aktuelles Problem in Illustrator oder einem anderen Adobe Programm? Dann helfe ich Ihnen gerne als JavaScript-Entwickler mit meiner jahrzehntelang Programiererfahrung.
Schreiben Sie mir einfach und unverbindlich per Kontaktformular.
Adobe ExtendScript
Das Scripting (Programmierung) in Adobe Illustrator basiert auf Adobe ExtendScript, eine Abart von ECMAScript 3, kurz ES3, und ist somit ein Dialekt von Javascript. Die Dateiendung eines Adobe ExtendScript ist ».jsx«. Trotzdem spricht man auch bei den Adobe Programmen von Javascripts. Javascripts haben übrigens die Endung ».js«.
(Tipp:) Wenn Sie noch nicht mit Javascript vertraut sind, dann lesen Sie zuerst die Artikel »Illustrator mit Javascript automatisieren« und »Javascript Variablen für Illustrator 2022«.
Inhaltsverzeichnis
- Adobe ExtendScript
- Schleifen in der Programmierung
- Schleifen in Javascript
- Das zeitliche Verhalten der Schleifen
- Fazit
Schleifen in der Programmierung
Schleifen (Wiederholungen) erlauben es, bestimmte Anweisungen wiederholt auszuführen. Dadurch wird der Quellcode (Programm in Klartext) deutlich kürzer und variabler. In jeder Programmiersprache bestehen die Kontrollstrukturen der Schleifen aus einer Abbruchbedingung, die prüft, wann die Schleife enden muss, und einen Anweisungsblock.
Vereinfacht sieht eine Schleife mit der Prüfung VOR dem Anweisungsblock so aus:
(1:) Ist die Abbruchbedingung nicht erfüllt, weiter zu (2:).
(2:) Anweisungsblock ausführen und zurück zu (1:).
(3:) Nächste Anweisung (außerhalb der Schleife).
Weil die Abbruchbedingung VOR der Anweisungsblock (2:) steht, kann es sein, dass dieser nicht ausgeführt wird oder x-mal.
Dagegen, wenn die Prüfung NACH dem Anweisungsblock steht, wird dieser mindestens einmal ausgeführt.
(A:) Anweisungsblock ausführen und weiter zu (B:).
(B:) Ist die Abbruchbedingung nicht erfüllt, zurück zu (A:).
(C:) Nächste Anweisung (außerhalb der Schleife).
In den meisten Programmiersprachen gibt es verschiedene Schleifen:
- For-Schleife, die von einem numerischen Startwert bis zu einem Endwert durchläuft, zum Beispiel von 50 bis 70 oder als Countdown von 10 bis 0.
- While-Schleife, die mit der Abbruchbedingung beginnt und der Anweisungsblock folgt.
- Do-While-Schleife, die mit Anweisungsblock und mit der Abbruchbedingung endet.
Repeat-Until folgt dem gleichen Konzept wie die Do-While-Schleife, benutzt jedoch andere Schlüsselworte.
Schleifen in Javascript
Die ersten drei Schleifen (For, While und Do-While) stehen in Javascript zur Verfügung. Damit Schleifen funktionieren können, benötigen Sie Variablen.
For-Schleife in Javascript
var vZähler = 0;
for (var i = 0; i < 10; i++) { /* Abbruchbedingung */
vZähler = vZähler + 1; /* Anweisungsblock */
}
Diese Schleife läuft von 0 (var i = 0) bis 9 (Abbruchbedingung 9 ist kleiner 10: i < 10) genau zehnmal durch.
(Hinweis:) Die Schreibweise i++ ist eine Abkürzung zu i = i + 1 (der Erhöhung des Wertes in i um jeweils plus 1).
While-Schleife in Javascript
var i = 0;
var vZähler = 0;
while (i < cDauer) { /* Abbruchbedingung */
vZähler = vZähler + 1; /* Anweisungsblock */
i++;
}
Diese Schleife entspricht der obigen For-Schleife und läuft analog genau zehnmal durch.
Do-While-Schleife in Javascript
var i = 1;
var vZähler = 0;
do {
vZähler = vZähler + 1; /* Anweisungsblock */
} while (i++ < cDauer); /* Abbruchbedingung */
Diese Schleife beginnt, im Gegensatz zu den beiden anderen, bereits mit i = 1, weil die Abbruchbedingung erst am Ende geprüft wird.
Verschachtelte Schleifen
Neben diesen einfachen Schleifen kann es bei der Programmierung vorkommen, das Schleifen in Schleifen ablaufen (verschachtelte Schleifen) und damit multipliziert sich die Anzahl der Schleifen-Durchgänge und damit die Laufzeit der Schleifen. Hierin oft liegt die Langsamkeit von Prozessen und Programmen. Denn auch wenn Computer immer schneller werden, sollten Schleifen stets optimiert sein und so schnell wie möglich ablaufen.
var i = 0;
var j = 0;
var vZähler = 0;
for (var i = 0; i < 10; i++) { /* 1. Abbruchbedingung */
for (var j = 0; j < 10; j++) { /* 2. Abbruchbedingung */
vZähler++;
}
}
Diese Schleife läuft 10 x 10 Durchgänge, also insgesamt 100-mal durch. Diesen Wert hat am Ende auch die Variable vZähler.
Das zeitliche Verhalten der Schleifen
(Hinweis:) Ich habe die oben erwähnten drei Schleifentypen als einfache und doppelte Schleife als ganz einfaches Javascript programmiert und diese sechs Javascripts in Adobe Illustrator 2022, Adobe InDesign 2022, Adobe Photoshop 2022 und QuarkXPress 2020 laufen lassen. Dabei habe ich jeweils den aktuellen Zähler der Ticks genau vor und nach der Schleifenkonstruktion in zwei Variablen gespeichert. Die Differenz der beiden Zahlen ergibt die Laufzeit. Die Ergebnisse für Schleifenkonstruktionen, die 25.000.000 Durchläufe haben, sind recht erstaunlich. Die hohe Zahl der Durchläufe zeigt am besten die Unterschiede in den Programmen.
(Tipp:) Sie finden unten den Link zum Downloaden der sechs Javascripte und selber testen.
Schleife | Illustrator | InDesign | Photoshop | QuarkXPress |
1x for | 5.935 sec. | 4.101 sec. | 4.086 sec. | 0.060 sec. |
2x for | 5.713 sec. | 4.138 sec. | 4.138 sec. | 0.054 sec. |
1x while | 10.782 sec. | 7.996 sec. | 7.485 sec. | 0.057 sec. |
2x while | 10.447 sec. | 8.427 sec. | 7.401 sec. | 0.061 sec. |
1x do-while | 8.343 sec. | 5.616 sec. | 5.768 sec. | 0.058 sec. |
2x do-while | 8.198 sec. | 5.558 sec. | 5.723 sec. | 0.059 sec. |
Der Illustrator hat leider den schlechtesten Javascript-Interpreter, wohin geben QuarkXPress den besten hat.
Die sechs Javascripts können Sie downloaden und mit Ihrem System selbst testen:
(Download:) Download Sechs-Schleifen-Javascript.zip (16 kByte) als (.zip) Zip-Archiv. (Update:) 12.01.2022.
(Hilfe:) Probleme beim Download?
Macht das Betriebssystem bei der Geschwindigkeit für Schleifen einen Unterschied?
(Update:) 20.01.2022 – Die Antwort lautet ja. Ich habe die zweifache do-while-Schleife in (AI:), (PS:) und LiveCode in macOS 10.15.7 und in Windows 10 (Parallels Desktop 17.1.) auf dem gleichen MacBook Pro getestet. Ich hatte erwartet, dass unter Windows 10 wegen der Virtuellen Maschine die Doppelschleife mehr Zeit braucht. Doch das Ergebnis war für Illustrator anders. Der (FM:) FrameMaker, den es nur noch für Windows gibt, liegt im Mittelfeld.
- (AI:) (Mac:) = 8,237 und (Win:) = 6,336 Sekunden.
- (PS:) (Mac:) = 5,438 und (Win:) = 7,535 Sekunden.
- (FM:) (Win:) = 6,464 Sekunden.
Macht die Art der Javascript-Datei bei der Geschwindigkeit für Schleifen einen Unterschied?
Ich habe das Javscript »Schleife-06.js« unverschlüsselt als .js, .jsx und verschlüsselt als .jsx, .jsx mit eval oder .jsx mit function aufgerufen je drei mal ausgeführt. Hier die Ergebnisse: Am schnellsten war die unverschlüsselte .jsx-Datei und am langsamsten die verschlüsselte .jsx mit function aufgerufen.
Javascript in (AI:) | 1. Test | 2. Test | 3. Test | |
js | 8.089 sec. | 7.993 sec. | 8.098 sec. | |
(Gut:) | jsx | 7.872 sec. | 7.966 sec. | 8.021 sec. |
jsx(bin) | 8.124 sec. | 8.317 sec. | 8.158 sec. | |
jsx(bin) mit eval | 8.293 sec. | 8.503 sec. | 8.315 sec. | |
(Schlecht:) | jsx(bin) mit function | 8.127 sec. | 8.527 sec. | 8.286 sec. |
Es macht selbst bei 5000 x 5000 Schleifendurchläufe keinen großen Unterschied, in welcher Art die Javascript-Datei ausgeführt wird. Trotzdem ist die unverschlüsselte .jsx-Version die schnellste. Außer in (AI:) Illustrator kann man in (BR:), (FM:), (IC:), (ID:) und (PS:) auch direkt eine verschlüsselte ».jsxbin« (Binärdatei) ablaufen lassen. Einen Geschwindigkeitsvorteil konnte ich für diese Datei nicht messen.
(Tipp:) Wie Sie ein Javascript für Adobe Programme, die das unterstützen, verschlüsseln können erfahren Sie im Artikel »Javascript für Adobe Illustrator 2022 verschlüsseln«.
Fazit
Normalerweise sind While-Schleifen die schnellere Variante, was man an den Ergebnissen von QuarkXPress sieht. Jedoch in Adobe Illustrator, InDesign und Photoshop sind die For-Schleifen schneller und doch 100 bis 200 % langsamer als in QuarkXPress 2020. Lässt man die Schleifen in einem Webbrowser wie Apple Safari ablaufen, bekommt man ebenfalls ähnlich schnelle Werte wie mit QuarkXPress. Daher muss Adobe dringend an ihrem Javascript-Interpreter nachbessern.
ENDE
(Hilfe:) Wenn Sie eine Funktion in (AI:), (PS:), (IC:), (ID:) oder (FM:) benötigen, jedoch nicht selbst programmieren, dann sprechen Sie mich an. Ich übernehme gerne kleine Aufträge: zum Kontaktformular.