大容量変数使用時の動作速度低下に対する処理 Ver1.0への言い訳

Written at 1998.02.07
Last Update at 1999.05.05


 「改行文字指定マクロ」のVer4.0への改訂で、表題の事項は考慮外となりました。解決したと言うより、大した存在ではなくなったので取り立てて取り上げることでもない、と言うところでしょうか。

 まあ、せっかく書いたんで、残しておきますが、読む価値はありません。

AKT(1999.05.05)

indexへ戻る


 以下、全ての動作確認は、秀丸エディタ for Windows95 Ver2.20で行いました。(1998.04.16)


 どうも、AKTです。

 以前からあった、バグレポートにも増して訳の分からないタイトルですが、Ver3.0への改訂作業時に、また、どーしても書かずに入られないような苦しみを味わってしまいました。というわけで書きました。よほど暇な人以外は読み進まない方が無難です。ご注意を。

 


 「大容量変数使用時の動作速度低下に対する処理 Ver1.0」とは、下記のようなマクロとなっています。

 

・Ver3.0時 76行〜96行

//--- 大容量変数使用時の動作速度低下に対する処理 Ver1.0 (1998.02.06) --------
    $full="";
    #l=1;
    while(#l < 7){
        $full=$full+$full[#l];
        $full[#l]="";
        #l=#l+1;}
    if(#full == 0 || #sfull == 0)
        $full="";
    if(#harf == 0 || #sharf == 0)
        $harf="";
    if($full != "" && getininum(hidemarudir++"\\"+$inifile,"Message","Down") == 0){
        question "《このメッセージは1回しか表示されません》\n\n[改行全角文字指定] が "+char(34)+"(part)"+char(34)+" だと、\n動作速度が最大 "+char(34)+"(all)"+char(34)+" 時の1/3ほどに\n低下します。(バグではありません。多分)\n\n処理を続けますか?";
        if(!result)
            goto end2;
        writeininum hidemarudir+"\\"+$inifile,"Message","Down",1;}
//-------------(詳しくは、ホームページで………………またこんなモノを)-------

 

 今回の改訂では、全角文字の指定を極力チェックボックスで出来るようにしたために、変数への負担が大きくなりすぎて(トータルで有効1600文字以上!実際は、3000文字以上を変数に置いてました)、マクロの動作に支障をきたすようになった、みたいなんです。

 実際には、そんな負荷がかかるような動作はしてないのに、

「どーしたんや!」

っていうほど、遅くなったんです。

 

 初めは、変数への負担だとは気付かずに、何度もマクロを見直し、以前のバージョンとの比較を繰り返し、果てには、メインルーチンをまるごと元に戻しても全然速くならない(と言うか元にも戻らない)。

 結局、サブルーチンの追加した部分を、一つ一つRemにしながら、確認する羽目になりました。

 そこでようやく、巨大すぎる変数に原因があることが分かりました(変数を使おうが使うまいが、存在すること自体で負荷がかかっているようです)。

 しかし! そうなると、今回の改訂は無理!(今回のやり方以外に思いつかないし、このやり方にしても、相当構想を練ったんですよ。ぼけーっと……) と言うことになってしまいます。

 

 元々、作業用の変数は、クリアもせずほったらかしでメインに移っていたのですが、こうなるとそう言うわけにも行かず、極力消すように、大改造(作業中に方針が変わってあちらこちらをいじり倒すのは、結構骨なんですよ)。

 

 それで、やる事は全てやった、というとこまでこぎつけたんですが、予定の変数を使うのと使わないのでは、3倍近い速度の差が出てしまう……。

「ここまで来て中止はいやー!」

 こうなったら、いまいちなのは承知で、強引に区切りをつけました。

 

「どっちでも出来るようにしとけばいいか」

「でも、あまりもの速度差に、バグやと思われたら……」

「おー、そうか、メッセージ出しとけばいいんや」

「けど、毎回でるのはうっとしいな……こーして……」

「もーちょっと詳しく説明しときたいなー」

「……そーいえば、得意技があったか」

「…………わかりやすい命令を集めて……タイトルは……まーそのままでいいか……」

 


 結局、余計なことも書いてしまったようですが、だいたい、こういう経緯です。

 この、「大容量変数使用時の動作速度低下に対する処理 Ver1.0」は、外れることはないはずです。変数での負担は秀丸自体の仕様でしょうし、無駄な変数はクリアしておいた方がいいことは確かでしょうから(メッセージが外れるぐらい。でも、まー、1回しか出ないし……)。これがバグじゃない理由です。

 

 最終的には、

[改行全角文字指定][改行半角文字指定]ボタンで設定するよりは、[改行[全半角]文字指定]エディットボックスで設定した方が、断然速い。 

・具体的には、改行文字指定ボタンのそれぞれの"有効"チェックボックスを[OFF]にして、エディットボックスの方に、全ての改行指定文字を入力するか、それぞれのボタンの全てのチェックボックスを[ON]にして、"(all)"にしてしまうかです。

・つまり、"有効"チェックボックスを[OFF]にするか、それぞれのボタンを"(all)"状態にすることによって、「大容量変数使用時の動作速度低下に対する処理 Ver1.0」が、巨大な変数をクリアしてくれる、ということでただそれだけなんです。

となってしまいました。

 

 よく考えると、何の解決にもなっていないように見えますが、現状でも初期の3/5くらいで動作するようにはしているんです……って、それもあんまりか。

 しかし、まー、物は使いよう。書式がはっきりしない場合は、初期設定で。改行する文字がはっきりしていて、数も少ない物には、例の方法でって事で。

 

 実際の速度の差はここ、操作の解説はここでどうぞ。

 

 今回は短いでしょ?

 


追記(1998.03.03)

 

 ちょっと気になったんで、もう一度確かめてみました。

 

 Ver3.3の203行から220行の行の先頭に"//"を挿入します。

//     if(code <= 33982 && code >= 33089){
//         if(#full == 0)
//             goto del;
//     else{
//         if(#sfull == 0)
//             goto next;
//         else{
//             if(midstr($full,code-33089,1) == "1")
//                 goto next; }}}
//     if(#pc98 == 1 && code <= 34716 && code >= 34624){
//         if(#full == 0)
//             goto del;
//     else{
//         if(#sfull == 0)
//             goto next;
//         else{
//             if(midstr($full[7],code-34624,1) == "1")
//                 goto next; }}}

 これで、[改行全角文字指定]用の変数"#full"を使わないようになります(定義は通常通りしてあります)。

 

 次に"speed1.txt"を秀丸で開き、「改行文字指定マクロ」の初起動時の設定に加えて、[改行[全半角]文字指定]エディットボックスに、「。」を入力します(変数"#full"をつかわないようにしたので、"speed1.txt"唯一の改行指定文字である「。」を指定するためです)

 そこでマクロを実行させると、終了までに、自分の環境では、約2分45秒かかりました。

 

 また、上のような編集を行わず、"spped1.txt"を秀丸で開き、「改行文字指定マクロ」を初起動時の設定で実行させた場合は、約3分30秒でした。

 

 この2つの結果だけを見ると、

「変数の容量で、負荷がかかるんじゃない。変数を使っている動作に対して負荷がかかったってるんだ」

 と、言うことになりそうなものですが、そうとばかりも言えない別の結果があります。

 

 "speed1.txt"を秀丸で開き、通常の「改行文字指定マクロ」を初起動時の設定で起動させ、[改行[全半角]文字指定]エディットボックスに、「。」を入力した後、[改行全角文字指定]の[有効]チェックボックスを「OFF」にします。こうすると、実行前に変数"#full"をクリアするようになります。

 それで実行させると、約1分55秒でした。

 

 これまでの結果を簡単に並べると、

1.変数"#full"有効"#full"を使うルーチン無効−「。」指定 :2分45秒

2.変数"#full"有効"#full"を使うルーチン有効       :3分30秒

3.変数"#full"無効"#full"を使うルーチン有効−「。」指定 :1分55秒

と、なります。

 「。」指定以外の項目は、有効だと負荷になると考えたものです。

 

 これでおわかりかと思いますが、「"#full"を使うルーチン」より「変数"#full"」の方が負荷が大きい、と言う結果が導き出せそうな感じがしますね。

 

 ちなみに、

4.変数"#full"無効"#full"を使うルーチン無効−「。」指定 :1分40秒

でした。

 

 見切り発車でしたが、何とかまとまりましたね。(1998.03.03)


 戻る