複数行コメントの動作が重いNo.39953
fzok4234 さん 22/08/14 00:06
 
夜分恐れ入ります。fzok4234です。


さて、少し重い正規表現で強調を行う際に通常の「強調表示」よりも「複数行コメン
ト」のほうが本文入力や
スクロールの動作が重くなっているような気がしますが、気のせいでしょうか ?

「動作環境」=>「トラブル対策」=>「その他のトラブル対策」の「強調表示のキャッ
シュを使わない」はちゃんと
OFF にしています。


環境は、
 ・秀丸エディタ : 9.18β3 Float x64
 ・HmJreSelect.dll : 0.20
 ・hmonig.dll : 0.8.7.0
です。



[ ]
RE:39953 複数行コメントの動作が重いNo.39962
秀丸担当 さん 22/08/17 11:20
 
複数行コメントのユーザー定義は、強調表示のようなキャッシュはしていないです。
申し訳ありませんが、そういう仕様ということでお願いします。
色付けの情報だけでなく、どういう定義の結果とかペアだとか色以外の情報もあり複
雑なので、やるとしたらリスクが高いので、できたら手を付けたくないところです。
できるようにしてほしいという話になると思うので、あらかじめ、そういうご要望が
あるということにしておきます。

[ ]
RE:39962 複数行コメントの動作が重いNo.39963
fzok4234 さん 22/08/17 12:20
 
> 色付けの情報だけでなく、どういう定義の結果とかペアだとか色以外の情報もあり
>複雑なので、やるとしたらリスク
> が高いので、できたら手を付けたくないところです。

一応、「複数行コメント」を多用しないといけない理由として、前々から申し上げて
いるように通常の「強調表示」に
 ・数値。
 ・文字列。
 ・コメント。
が未だ含まれていないことが挙げられます。この中で、「数値」はほぼ必ず、「文字
列」と「コメント」も場合によって
 1 行に収まるものです。現状ではこれらを「複数行コメント」の種類「単一の文字
列」で代用しないといけません。

その結果、例えば次の C# のコード

System.Int32 foo =
        ( 0b1100_0000_0000_0000 /* 寿限無寿限無 */ | 0b0010_0000_0000_0000 /
* 五劫の */ | 0b0001_0000_0000_0000 /* 擦り切れ */ ) // 1 行目
    |   ( 0b0000_1000_0000_0000 /* 海砂利 */ | 0b0000_0100_0000_0000 /* 水魚
の */ ) // 2 行目
    |   ( 0b0000_0010_0000_0000 /* 水行末 */ | 0b0000_0001_0000_0000 /* 雲来
末 */ | 0b0000_0000_1000_0000 /*風来末*/ ) // 3 行目
;

のように、1 行に何度も「数値」や「コメント」などが入ってて、これが何行も連続
するような場合では、1 つのウィンドウ内で
大量の「複数行コメント」の正規表現のコンパイルが繰り返し実行されてしまって、
本文入力やスクロールに著しく支障を
来してしまいます。

もし現状で対処が困難であれば、せめて前々から申し上げている通り通常の「強調表
示」に数値などを追加するなど、
何らかの問題回避手段の提供をお願いしたいところでございます。どうかよろしくお
願いします。




[ ]
RE:39963 複数行コメントの動作が重いNo.39965
秀丸担当 さん 22/08/17 13:49
 
ご存じと思いますが、というかfzok4234さんのために作ったような機能ばっかりなの
ですが、カラーマーカーで実際に文字列やコメントとして効果がある色付けでも何で
もできるので、それで自由にしてもらればいいと思います。
その重い処理を別の場所でなく同期的にマクロ自身でやるのは無いと思いますが、そ
れで強調表示しなかいという結論に達したのであれば、これで我慢して使っていただ
くしかないです。

しいて対応するとすれば、何らかの色付け結果情報を反映させるのをまとめてJSONと
か何かで一括でできる方法があったらいいと思います。
V9.18ではJavaScript対応もあって、そのへんがやりやすくなってくるかもしれませ
ん。(まだ不足はあるかもしれませんが)

[ ]
RE:39965 複数行コメントの動作が重いNo.39967
fzok4234 さん 22/08/17 14:50
 
> ご存じと思いますが、というかfzok4234さんのために作ったような機能ばっかりな
>のですが、カラーマーカーで
> 実際に文字列やコメントとして効果がある色付けでも何でもできるので、それで自
>由にしてもらればいいと思います。
> その重い処理を別の場所でなく「同期的」にマクロ自身でやるのは無いと思います
>が、それで強調表示しなかいという
> 結論に達したのであれば、これで我慢して使っていただくしかないです。

本来ならば、 colormarker 文を こみやんま さんの Hm.NET.dll の Hm.Macro.State
ment() で呼び出す処理を、
自作の C# の DLL から async-await 構文を使って「非同期」で行いたいところです。

しかし、マクロヘルプの
 https://help.maruo.co.jp/hidemac/html/200_Dll_Api.html
には、
> 関数の呼び出しは、メインスレッドと同じスレッドから呼び出す必要があります。
> (Hidemaru_AnalyzeEncoding, Hidemaru_LoadFileUnicodeは除く)
と書かれており、 Hm.Macro.Statement() の母体である Hidemaru_EvalMacro() 関数
もマクロ本体とは別スレッドでの
「非同期」で呼び出してはいけないこととなっていてスレッドセーフではありません。

このため、対象テキストの入れ子構造の解析などの重い処理を待ってから、その結果
に基づく colormarker 文での
強調を行うようなマクロの実装にせざるを得ないような状況です。

しかし、このような実装で強調の更新の度に 10 数秒も固まるのは実用に耐えないた
め、入れ子構造の解析で精度を
上げることは断念して、同じ行内での前方 / 後方参照だけを行ってトークンの種類
を特定する形に方針転換
いたしました。

おっしゃるとおりであれば、当面は
 1.  数値 / 文字列 / コメント以外は通常の「強調表示」。
 2.  数値と単行の文字列 / コメントは colormarker 文。
 3.  2 行以上の文字列 / コメントは「複数行コメント」。
の 3 系統に分割して対処することになりそうです。今後もし、Hidemaru_EvalMacro
() がスレッドセーフ対応されれば
その時に晴れて colormarker への全面移行の検討時期となります。


> しいて対応するとすれば、何らかの色付け結果情報を反映させるのをまとめてJSON
>とか何かで一括でできる方法が
> あったらいいと思います。
> V9.18ではJavaScript対応もあって、そのへんがやりやすくなってくるかもしれま
>せん。
> (まだ不足はあるかもしれませんが)

現時点では こみやんま さんとやり取りされながら仕様を策定されている段階のため、
最終的な仕様が固まったのち
安定した状態がしばらく続いてから改めて要望させていただくことになります。




[ ]
RE:39967 複数行コメントの動作が重いNo.39968
秀丸担当 さん 22/08/17 16:52
 
非同期というのは、重い処理だけが別スレッドだったり別プロセスだったりすればい
いと思いますが、結果を適用すること自体は同じスレッドであればいいです。
Hidemaru_EvalMacro() は、マクロ実行中(つまりdllfunc内)でしか効かないように
なっているので、それが呼ばれるということは普通のマクロ実行で、メインスレッド
です。
WM_REMOTE_EXECMACRO_FILEやWM_REMOTE_EXECMACRO_MEMORYは、その逆でマクロ実行中
はできなくて、ウィンドウに対してメッセージを送ればメッセージ処理はメインスレ
ッドになります。
独自にメインスレッド上でWindows APIのSetTimerとかすれば、それもメインスレッ
ドになります。
JavaScriptはいまのところマクロを実行できるところまでで、レンダリング等は制限
していますが、マクロを抜けた後でもそれがメインスレッドであれば動作するはずに
なる予定(のつもり)です。
ブラウザとしてのwindow.setIntervalも使えてしまうようになると思います。
なので、colormarker文が羅列するのであれば現状でできると思いますが、JSONか何
かで一発でできたら楽だと思います。

[ ]
RE:39962 複数行コメントの動作が重いNo.39972
fzok4234 さん 22/08/22 15:18
 
> 色付けの情報だけでなく、どういう定義の結果とかペアだとか色以外の情報もあり
>複雑なので、やるとしたらリスクが
> 高いので、できたら手を付けたくないところです。

ここで疑問があるのですが、上記のような「全ての色付け情報」ではなく正規表現の
「 Jre2Compile() 済み JRE2 構造体」だけを
キャッシュするのであれば「どういう定義の結果とかペアだとか」は関係ないように
見えるのですがどうでしょうか ?

現在当方で使用している正規表現パターンの多くは、「コンパイル」に多少時間がか
かっても検索の「実行」は比較的高速に
できるものとなっています。どうやら「複数行コメント」では正規表現の「コンパイ
ル」のオーバーヘッドが足を引っ張っている
感じです。

できれば正規表現の「実行」の結果からなる「全ての色付け情報」のキャッシュは無
理であっても、せめて「コンパイル」済みの
JRE2 構造体だけでもキャッシュするよう努めてもらえればと思っています。



[ ]
RE:39972 複数行コメントの動作が重いNo.39973
秀丸担当 さん 22/08/22 16:48
 
強調表示と複数行コメントのユーザー定義は、基本的にはコンパイルは最初だけで、
キャッシュするようになっています。
例外的に、複数行コメントのユーザー定義で「開始文字列のタグを終了文字列でも使
う」になっているとき、動的にコンパイルが発生するようになっていました。
もう少し効率化できる余地はあると思いますが、一応現状では必要があってそうなっ
ているということでお願いします。
コンパイルを少なくできたほうがいいということで、ご意見参考にさせていただきま
す。

[ ]