イラストレーターのスクリプトを高速化させるためのコツ

2つのスクリプトの速さの違いはどこにある。 - なにする?DTP+WEB
スクリプトの実行速度の違いに釈然としないままだったのですが。
Mr.Riさんより大変有用なサンプルを公開していただきました。
丁寧なコメント付ですごく参考になりました。
Mr.Riさんのページには便利なスクリプトが沢山公開されています。
Mr.Ri HomePage/ステレオ写真・山めしレシピ・DTPツール


そでれは、サンプルから解ったことを書いていこうとおもいます。
自分の書いたスクリプトが遅くて悩んでいる方必見ですよ。
イラストレーターのドキュメント中で、沢山のパスの中から0.3pt以下の線を抜き出すスクリプト

普通に書くとこう書くと思う。

(function(){
var X = (new Date).getTime();
//-----------------------------------
var P = app.activeDocument.pathItems;//アクティブドキュメントのパスアイテム
var L = P.length; //パスの数
//
for(i=0; i<L; i++){
	CheckHearLine(P[i])
}

//渡されたパスが0.3pt以下なら選択状態にする
function CheckHearLine (PathObj){
	if( Math.round( PathObj.strokeWidth * 100 ) / 100 < 0.3  &&  ! PathObj.guides )PathObj.selected = true;
}
//-----------------------------------
var Y = (new Date).getTime();
alert(Y-X);
})();

結果はこんな感じ。



こそで、爆速化サンプルを参考にレイヤー毎に処理していくことにする。
サンプルではサブレイヤーも処理していくのだけど今回は解り易く1階層のみレイヤー毎に処理するようにする。

(function(){
var X = (new Date).getTime();
//-----------------------------------

//
for(x=0; x < app.activeDocument.layers.length;x++){
var P = app.activeDocument.layers[x].pathItems;//レイヤーのパスアイテム
var L = P.length; //パスの数
for(i=0; i<L; i++){
	CheckHearLine(P[i])
}
}

//渡されたパスが0.3pt以下なら選択状態にする
function CheckHearLine (PathObj){
	if( Math.round( PathObj.strokeWidth * 100 ) / 100 < 0.3  &&  ! PathObj.guides )PathObj.selected = true;
}
//-----------------------------------
var Y = (new Date).getTime();
alert(Y-X);
})();

これだけでも十分な効果が得られます。
おお、スバラシィ〜。

結果をふまえて、
スクリプトオブジェクトモデルを眺める。

こういうことなのかな?
Mr.Riさんの解説ではイラストレーターだけではなくインデザインでも同じようなことが言えるそうです。
成る程。なるほど。

これをふまえて普段自分が使っているスクリプトに適用する。
いままで。

(function(){
var X = (new Date).getTime();
//-----------------------------------
#include 'c.js';
c('pathItems').each(CheckHearLine);
//渡されたパスが0.3pt以下なら選択状態にする
function CheckHearLine (PathObj){
	if( Math.round( PathObj.strokeWidth * 100 ) / 100 < 0.3  &&  ! PathObj.guides )PathObj.selected = true;
}
//-----------------------------------
var Y = (new Date).getTime();
alert(Y-X);
})();


これから。

(function(){
var X = (new Date).getTime();
#include 'c.js';
//
c('layers').each(function(){c(this.pathItems).each(CheckHearLine)});
//渡されたパスが0.3pt以下なら選択状態にする
function CheckHearLine (PathObj){
	if( Math.round( PathObj.strokeWidth * 100 ) / 100 < 0.3  &&  ! PathObj.guides )PathObj.selected = true;
}
var Y = (new Date).getTime();
alert(Y-X);
})();

おお。

これで、速度的にあきらめてたあんなことやこんなこともできるかもしれない。
ウホォォォォ。



理屈は良くわからないけど
こういう話も関係があったりするのかな?
一行で IE の JavaScript を高速化する方法 - IT戦記