[ 新規に投稿する ]

アウトライン解析の枠が重いNo.41498
fzok4234 さん 24/12/02 16:11 [ コメントを投稿する ]
  毎度お世話になっております。Fzok4234 です。


さて、以前から気になっていることがあるのですが、アウトライン解析の動作が非常に
重くなって困ることがあります。

問題となる設定は主に、「ファイルタイプ別の設定」->「アウトライン」->「解析」で
「ツリー表示 - 通常」を選択し、各項目のプロパティで「見出しの定義」を「強調表示」に
している場合です。「ファイルタイプ別の設定」->「デザイン」->「強調表示」で動作の
重い正規表現を使用しているときに顕著に症状がみられます。

「動作環境」->「トラブル対策」->「その他のトラブル対策」で、「強調表示のキャッシュを
使わない」は OFF になっています。


1. 本文の行の追加や削除でアウトライン解析の枠の更新が遅い。

アウトライン解析の枠に見出しが多く表示されているときに、定義した見出しを含む行を
新たに追加するかまたは削除するときに、枠の内容の更新に時間がかかります。強調表示の
キャッシュがあるにもかかわらず、全ての強調表示の正規表現の評価をやり直しているような
感じの遅さです。

特に、ファイルの先頭の方で行の追加や削除を行うと症状が顕著に出ます。見出し項目の並びを、
ハッシュテーブルのような挿入 / 削除を高速に行える手段を用いずに、単純な可変長配列で
実装しているような感じにも見えます。


2. 検索文字列を含む見出しの強調が遅い。

「ファイルタイプ別の設定」->「アウトライン」->「解析」で「検索文字列を含む見出しを強調」を
有効にしているときに、検索ダイアログから「検索文字列を強調」を有効にして「すべて検索」->
「検索文字列を強調」をクリックして検索を実行すると、アウトライン解析の枠の該当する
見出しが強調されるまでに時間が掛かり、その間アウトライン解析の枠は一切操作を受け付けなく
なります。

これも 1. と同様にキャッシュがあるのに正規表現の評価を全てやり直しているような感じです。

特に GREP で「検索文字列を強調」を有効にして結果リストからタグジャンプする度に待たされるので、
かなり鬱陶しいです。


いずれも何だか無駄な処理を内部で行っているような感じなので、修正してもらえれば助かります。
どうかよろしくお願いします。


該当の秀丸エディタは 9.39β10 通常版 x64 です。


[ ]
RE:41498 アウトライン解析の枠が重いNo.41499
秀丸担当 さん 24/12/02 17:09 [ コメントを投稿する ]
  ご意見ありがとうございます。
そういうご意見があるということで参考にさせていただきます。
[ ]
RE:41499 アウトライン解析の枠が重いNo.41500
fzok4234 さん 24/12/02 20:56 [ コメントを投稿する ]
  一応、再現手順も示しておきます。当方の CPU 環境は
・AMD Ryzen 9 5950X 16-Core Processor 3.40 GHz
となっています。


まず、拡張子 .test に対応する「ファイルタイプ別の設定」の「デザイン」の「保存/読込」で、
以下に示す Hilight.hilight 定義ファイルを読み込みます。これには、動作が大変重い強調表示と、
アウトライン解析のツリー定義が含まれています。

//----------------------------- Hilight.hilight ここから ---------------------------------------
21,(?#lookbehind)(?<=(?:(?<=(?<=.*)(?:.*)*(?=.*))(?:(?<=.*)(?:.*)*(?=.*))*(?=(?<=.*)(?:.*)*(?=.*)))*)a(?=(?:(?<=(?<=.*)(?:.*)*(?=.*))(?:(?<=.*)(?:.*)*(?=.*))*(?=(?<=.*)(?:.*)*(?=.*)))*)
17,(?#lookbehind)(?<=(?:(?<=(?<=.*)(?:.*)*(?=.*))(?:(?<=.*)(?:.*)*(?=.*))*(?=(?<=.*)(?:.*)*(?=.*)))*)b(?=(?:(?<=(?<=.*)(?:.*)*(?=.*))(?:(?<=.*)(?:.*)*(?=.*))*(?=(?<=.*)(?:.*)*(?=.*)))*)
81,(?#lookbehind)(?<=(?:(?<=(?<=.*)(?:.*)*(?=.*))(?:(?<=.*)(?:.*)*(?=.*))*(?=(?<=.*)(?:.*)*(?=.*)))*)c(?=(?:(?<=(?<=.*)(?:.*)*(?=.*))(?:(?<=.*)(?:.*)*(?=.*))*(?=(?<=.*)(?:.*)*(?=.*)))*)
145,(?#lookbehind)(?<=(?:(?<=(?<=.*)(?:.*)*(?=.*))(?:(?<=.*)(?:.*)*(?=.*))*(?=(?<=.*)(?:.*)*(?=.*)))*)d(?=(?:(?<=(?<=.*)(?:.*)*(?=.*))(?:(?<=.*)(?:.*)*(?=.*))*(?=(?<=.*)(?:.*)*(?=.*)))*)
/<TreeWord>
/0000,0000,0000,00000001,40001752,"","a"
/<TreeWordEx>
/TreeWordExData:0
//----------------------------- Hilight.hilight ここまで ---------------------------------------


次に、以下に示す Test.test ファイルを開きます。

//----------------------------- Test.test ここから ---------------------------------------------
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxaxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxbxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxdxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxaxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxbxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxdxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxaxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxbxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxdxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxaxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxbxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxdxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxaxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxbxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxdxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxaxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxbxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxdxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxaxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxbxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxdxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxaxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxbxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxdxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
//----------------------------- Test.test ここまで ---------------------------------------------

このファイルを開いた時点で、強調表示が適用されるまで約 6 秒掛かりましたが、アウトライン解析の
枠に見出しが表示されるまでに更に追加で約 6 秒掛かってしまいました。両者がほぼ同じ所要時間のため、
アウトライン解析の際に強調表示が「もう 1 度」評価されてしまっているのではないか、という疑いが
あります。


この Test.test の先頭の 1 行目に、以下の 1 行の文字列
xax
を追加すると、アウトライン解析の枠の内容更新に約 6 秒掛かりました。この追加した行を削除しても、
やはり更新に約 6 秒掛かります。いずれも強調表示の適用とほぼ同じ所要時間です。

ところが、末尾の 33 行目に同じ 1 行の文字列
xax
を追加 / 削除すると、内容更新に掛かった時間は 1 秒足らずで、先頭への追加 / 削除のときよりも大幅に
時間が短縮されています。

このことから、ファイルの行を追加 / 削除した部分以下の全ての強調表示が無駄に再評価されてしまって
いる可能性が示唆されています。


次に、検索ダイアログから文字列 a を「検索文字列を強調」を有効にして検索すると、アウトライン解析の
枠の見出しが強調されるまで約 6 秒掛かります。

やはり強調表示の適用とほぼ同じ所要時間となっており、強調表示の無駄な再評価が行われている気配が
感じ取られます。


[ ]
RE:41500 アウトライン解析の枠が重いNo.41501
秀丸担当 さん 24/12/03 12:33 [ コメントを投稿する ]
  詳しい情報ありがとうございます。
そういう事例として参考にさせていただきます。
[ ]

[ 新規に投稿する ]