[ 新規に投稿する ]

スクロールなどに伴う強調表示の実行タイミングについてNo.40186
fzok4234 さん 22/12/15 14:06 [ コメントを投稿する ]
  いつもお世話になっております。


さて、「強調表示」や「複数行コメント」において、正規表現が評価されて色付けが実行される
タイミングについて質問があるのですが、テキスト本文の内容の変更を一切伴わない「スクロール」、
「カーソル移動」、「検索」などの操作に伴っての再評価 / 実行は行われているのでしょうか ?

そして、もしこれらの操作で再評価 / 実行が行われているなら、それはウィンドウに表示されている
範囲とその前後に限定して行われているのでしょうか ? それとも全文に渡って行われているのでしょうか ?


と申しますのは、強調表示で重い正規表現を用いている場合、本文の内容の変更を一切伴わないはずの
スクロールなどの操作が重くなってしまう現象がみられたからです。

再現方法として、まず以下の .hilight ファイルを適用します。

/<HilightMulti>
/0014,00000002,00,5C,00010003,"(?<=^(?:(?:(?:(?:(?:[^\"]*[^\"']*[^\"\\(]*)*)*)*)*)*)\"",00010003,"\"(?=(?:(?:(?:(?:(?:[^\"\\)]*[^\"']*[^']*)*)*)*)*)*$)"

その上で、本文の内容を以下のようにします。

0001  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"bbbbbb"cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
0002  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"bbbbbb"cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
0003  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"bbbbbb"cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
0004  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"bbbbbb"cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
 ( 以下繰り返し )
1021  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"bbbbbb"cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
1022  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"bbbbbb"cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
1023  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"bbbbbb"cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
1024  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"bbbbbb"cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc

このとき、まずスクロールの速度が遅くなります。特に横スクロールが大変重くなります。また、クリックして
移動させたカーソルや、下検索でマッチした範囲が点滅を開始するまで 2 〜 3 秒かかるようになります。

このことから、スクロールなどの度に全文にわたって強調表示の再実行を無駄に繰り返しているような印象を
受けます。


これらのスクロールなどの動作は本文の内容の変化を一切伴わないものであるため、本来なら既に色付け済みの
強調表示を再度実行する必要は無いはずです。もし、スクロールなどの度に無駄に強調表示を再実行しているので
あれば、これをやめるような改善をしていただければ助かります。

どうかよろしくお願い申し上げます。


環境は、
 ・秀丸エディタ: 9.20β5 Float x64
 ・HmJre.dll: 5.31
 ・OS: Windows 10 Pro 1909 x64
 ・CPU: Intel Core i7 8700K
 ・GPU: NVIDIA GeForce GTX 1080
です。


[ ]
RE:40186 スクロールなどに伴う強調表示の実行タイミングについNo.40188
秀丸担当 さん 22/12/15 16:25 [ コメントを投稿する ]
  トレースしら調べたわけではないですが、同じようにして試してみたところ、最終行までは数秒かかりましたが、いったんそこまで行くと、編集しなければどの場所に上下左右にスクロールしても、すぐに応答があるようでした。
この例では開始文字列のタグを終了文字列で使ってはいないようですが、前の話題にあったように、タグを使う場合など場合によっては効率が悪いケースもあると思います。

とても時間のかかる正規表現を同期的にたくさん使うのは無理があると思うので、V9.19でマクロで非同期的にできるようになったので、そっち方面にしたほうがいいのではないかと思います。
LSPのマクロサンプルでは、外部で非同期に処理して、結果だけを受け取って、JSONで一括で適用しています。
マクロサンプルを適当にいじってもらっていいですし、LSPに準拠しなくても.netとかで自分流にしてもいいと思います。
理屈の上では、秀丸エディタ自身をLSPサーバーにすることもできると思います。
プライベートモードを作ったのは、もともと秀丸エディタをLSPサーバーにしてテストするためでした。
[ ]
RE:40188 スクロールなどに伴う強調表示の実行タイミングについNo.40189
fzok4234 さん 22/12/15 19:57 [ コメントを投稿する ]
  > トレースしら調べたわけではないですが、同じようにして試してみたところ、最終行までは
> 数秒かかりましたが、いったんそこまで行くと、編集しなければどの場所に上下左右に
> スクロールしても、すぐに応答があるようでした。

どうやら環境によってパフォーマンスが変わるみたいですね。もしかしたら、現在使用中の
 ・アンチウイルスアプリ。
 ・GPU のドライバー。
などがかかわっているかもしれません。


> とても時間のかかる正規表現を同期的にたくさん使うのは無理があると思うので、
> V9.19でマクロで非同期的にできるようになったので、そっち方面にしたほうがいいのでは
> ないかと思います。
> LSPのマクロサンプルでは、外部で非同期に処理して、結果だけを受け取って、JSONで一括で
> 適用しています。

マクロライブラリを拝見して驚きましたが、いつの間にか当方で論議していた「 LSP 」や
「 textlint 」に対応していたのですね。

ただただ感謝の念尽きぬものであります。どうもありがとうございます。


> マクロサンプルを適当にいじってもらっていいですし、LSPに準拠しなくても.netとかで
> 自分流にしてもいいと思います。

もし Microsoft が公開している既存の LSP サーバーに不満があれば、独自の構文解析器作りに
挑戦してみてもよいと思います。


重ね重ね、ありがとうございました。


[ ]

[ 新規に投稿する ]