|
> 言われている通り、Jre2Compileに時間がかかっている様子のようです。
正規表現の初期化・コンパイルのオーバーヘッドが想像以上に大きいことは理解でき
ました。
しかし、現状だと searchdown や finddown 、colormarkerallfound などの実行の度に
Jre2Compile() でのコンパイル
↓
Jre2GetMatchInfo() などでの検索
↓
Jre2Close() で解放
を繰り返すため、たとえ今回提示したような極端な例ではなくても短時間に大量の
searchdown 、finddown 、colormarkerallfound などの実行を行うときに Jre2Compi
le() の
オーバーヘッドが無視できないほど大きくなってマクロが重くなってしまうことは明
白です。
このため、マクロの最初の段階でこれから使用する正規表現をまとめてコンパイルし
てその
インスタンスを保持しておいて searchdown などでは Jre2GetMatchInfo() などの検
索関数のみを
実行し、マクロの終了時に正規表現インスタンスをまとめて Jre2Close() で解放す
るか、あるいは
keepdll や keepobject と同じように正規表現インスタンスをマクロ終了後も保持し
て、同じ
プロセスで次回のマクロ実行に繰り越せるような仕組みを新設したほうがよいと思い
ます。
具体的な提案として、以下のような方法を思いつきました。まず、
createregular $regexName , $pattern [ , $regexDllFullPath ] ;
正規表現をコンパイルしてそのインスタンスを保持する。
$regexName : 作成した正規表現インスタンスを識別する名前。
$pattern : 正規表現のパターン。
$regexDllFullPath : 使用する正規表現 DLL を明示的に指定する。省略時
は「動作環境」の
「環境」ページで指定されたものが適用される。
releaseregular $regexName ;
正規表現インスタンスを明示的に開放する。
$regexName : 解放する正規表現インスタンスの識別名。
keepregular $regexName , #mode ;
マクロ終了後も正規表現インスタンスを解放しないようにするかを支持する。
$regexName : 正規表現インスタンスの識別名。
#mode : 0 : マクロ終了後に自動開放する ( 既定値 ) 。
1 : マクロ終了後も自動開放しない。$regexName
は後から再利用や
releaseregular が可能。
というような文を新設の上、このコンパイル済み正規表現インスタンスの使用に関し
ては、searchdown 系文では
searchdown $regexName [ , word ] [ , casesense | nocasesense ] , createdre
gular [ , fuzzy ] [ , inselect ] [ , inselect2 ] [ , linknext ] [ , hilight
| nohilight ] [ , incolormarker ] ;
searchdown2 $regexName [ , word ] [ , casesense | nocasesense ] , createdr
egular [ , fuzzy ] [ , inselect ] [ , inselect2 ] [ , linknext ] [ , hilight
| nohilight ] [ , incolormarker ] ;
searchup $regexName [ , word ] [ , casesense | nocasesense ] , createdregu
lar [ , fuzzy ] [ , inselect ] [ , inselect2 ] [ , linknext ] [ , hilight |
nohilight ] [ , incolormarker ] ;
searchup2 $regexName [ , word ] [ , casesense | nocasesense ] , createdre
gular [ , fuzzy ] [ , inselect ] [ , inselect2 ] [ , linknext ] [ , hilight
| nohilight ] [ , incolormarker ] ;
というように検索文字列の代わりに正規表現インスタンスの識別名を使用して regul
ar | noregular の代わりに
新設した createdregular というキーワードを使用するようにします。replacedown
系文も以下のように同様とします。
replacedown $regexName , 置換文字列 [ , word ] [ ,casesense | nocasesense
] , createdregular [ , fuzzy ] [ , inselect ] [ , inselect2 ] [ , linknext
] [ , ask ] [ , hilight | nohilight ] [ , incolormarker ] ;
replaceup $regexName , 置換文字列 [ , word ] [ ,casesense | nocasesense ]
, createdregular [ , fuzzy ] [ , inselect ] [ , inselect2 ] [ , linknext ]
[ , ask ] [ , hilight | nohilight ] [ , incolormarker ] ;
replaceall $regexName , 置換文字列 [ , word ] [ ,casesense | nocasesense
] , createdregular [ , fuzzy ] [ , inselect ] [ , inselect2 ] [ , linknext
] [ , ask ] [ , hilight | nohilight ] [ , incolormarker ] ;
replaceallfast $regexName , 置換文字列 [ , word ] [ ,casesense | nocasese
nse ] , createdregular [ , fuzzy ] [ , inselect ] [ , inselect2 ] [ , linkne
xt ] [ , ask ] [ , hilight | nohilight ] [ , incolormarker ] ;
replaceallquick $regexName , 置換文字列 [ , word ] [ ,casesense | nocases
ense ] , createdregular [ , fuzzy ] [ , inselect ] [ , inselect2 ] [ , linkn
ext ] [ , ask ] [ , hilight | nohilight ] [ , incolormarker ] ;
同様に grep 関係も、
grep $regexName , 検索するファイル , カレントフォルダ [ , word ] [ , cases
ense | nocasesense ] , createdregular [ , fuzzy ] [ , subdir ] [ , icon ] [ ,
filelist ] [ , fullpath ] [ , hilight | nohilight ] ;
localgrep $regexName [ , word ] [ , casesense | nocasesense ] , createdreg
ular [ , fuzzy ] [ , icon ] [ , hilight | nohilight ] ;
grepreplace $regexName , 置換文字列 , 検索するファイル , カレントフォルダ
[ , word ] [ , casesense | nocasesense ] , createdregular [ , fuzzy ] [ , su
bdir ] [ , icon ] [ , filelist ] [ , fullpath ] [ , hilight | nohilight ] [ ,
backup ] [ , preview ] ;
という感じにします。searchdialog などの GUI ダイアログの表示関係への対応は後
回しでも構いません。
setsearch 文では
setsearch $regexName , 0x80000010 | 他のフラグ1 , 0x00000010 | 他のフラグ2 ;
というように、フラグ 2 に新たに 0x00000010 というコンパイル済み正規表現イン
スタンスの使用を
指示するフラグを新設します。
これにより、searchdown 、replacedown 、grep などの実行や setsearch 実行後の
finddown 、colormarkerallfound などでは
内部で Jre2GetMatchInfo() のみを実行する形で大幅に高速化を図るということにな
ります。
いずれにせよ現状では、「予め複数の正規表現をまとめてコンパイルして searchdow
n などではその
コンパイル済みの正規表現インスタンスを呼び出す」ということができないようなの
で、何らかの対策を
お願いしたいところです。
どうかよろしくお願いします。
|
|