低速な回線下でファイルサーバ上のファイルを開いておくとタブの切り替えに時間がかかる

  1. Kuroさん

    開発お疲れ様です。

    次のバージョンを今月公開するかも、という話をお見かけしまして、今か今かと楽しみにしています!
    今月といえばPixel 8も発売ということで、予約しようかどうしようかと悶々としていたり…。Pixel 7を使っているので、下取りに出せばそれなりに割り引かれるのですよね。うーん、悩ましい。

    さて、本題ですが、低速な回線下でファイルサーバ上のファイルを開いておくとタブの切り替えに時間がかかるようです。

    具体的な再現状況としては、

    1. ローカルのファイルを開く (これを "タブ1" とする)
    2. 低速なVPNを使った接続先のネットワークのファイルサーバ上のファイルを開く (これを "タブ2" とする)

    という2つのファイルを表示しているMeryウィンドウがあったとして、タブ1からタブ2に遷移する際に2, 3秒程度フリーズしたような挙動をするというものです。タブ2からタブ1に遷移する分にはいつも通りに一瞬で遷移します。

    https://www.haijin-boys.com/discussions/4039 と似たような話で、タブ切り替え時のファイル更新チェックなどでWindowsの標準APIからの応答が遅いという類のような気はしていますが、もしなにか対策がありそうなら、ご確認いただけると大変助かります。

    開いているファイル多めな状況で使っていると、ショートカットキー操作でのタブ切り替えを連打してアクティブタブを遷移することがあるわけですが、その途中に低速回線下のファイルのタブがいくつもあると操作にかなりの引っ掛かりを感じてしまいまして…。

    とはいえ、タブ切り替え時のファイル更新チェックを同期処理でかけたいというのはもっともな話ですし、きっと難しい話だろうとは思いますが…🤔

     |  yuko  |  返信
  2. ご報告ありがとうございます。

    > 次のバージョンを今月公開するかも、という話をお見かけしまして、今か今かと楽しみにしています!

    次のバージョンは、派手な機能追加はありませんが、ご要望への対応と、Mery の基本機能の向上といった感じになってます。

    > 今月といえばPixel 8も発売ということで、予約しようかどうしようかと悶々としていたり…。

    うはぁ、最新型はいいですね!しかし、注目の機能が "AI で顔入れ替え" って、叡智な用途しか思いつかないですね😍 予約しましょう!

    > 1. ローカルのファイルを開く (これを "タブ1" とする)
    > 2. 低速なVPNを使った接続先のネットワークのファイルサーバ上のファイルを開く (これを "タブ2" とする)

    手元のファイルサーバーで帯域制限をかけて検証してみたところ、タブの切り替え時に 2、3 秒、フリーズするのを確認できました。これは、ファイルの更新チェックに時間がかかっていることが原因と思われます。

    ご指摘のとおり https://www.haijin-boys.com/discussions/4039 で回答した内容で間違いありません。

    何か対策はないものかと、他のエディターでも確認してみました。

    ・秀〇エディタさん、E〇Editor さん、Notepad++

    → タブ切り替え時に更新チェックをしているようで、Mery と同様、タブ切り替えのタイミングでフリーズしました。

    ・サク〇エディタさん

    → 3 秒おきに更新チェックをしているようで、タブ切り替えのタイミングでフリーズしたり、しなかったりしました。また、編集中にも定期的にフリーズすることがあるようです。

    > とはいえ、タブ切り替え時のファイル更新チェックを同期処理でかけたいというのはもっともな話ですし、きっと難しい話だろうとは思いますが…🤔

    そうなんですよね。非同期にすると、更新チェックのたびにスレッドの生成と破棄が発生し、CPU に負荷をかけてしまうことと、API から応答がない場合、スレッドがフリーズするという問題も発生します。

    非同期ではないですが、更新チェックに 3 秒ぐらい遅延時間を設ける、というのも考えてみました。

    これにより、タブをサクサク切り替える際にはフリーズを回避できますが、3 秒経過すると更新チェックが走るので、上書き保存と更新チェックが競合する可能性があります。

    また、すぐに更新チェックが必要な場合でも 3 秒待たなければならないという煩わしさも出てきますね。

    難しいです…。ちなみに、更新チェックをオフにする、というのではダメですか?😅

     |  Kuro  |  返信
  3. 人類の叡智の集大成たるAI機能で叡智な用途に使うわけですね・・・w 思えば確かに映像上の人物の顔をフェイクにするアレな技術の親戚のような機能ですね、コレはw

    こちらの環境では秀丸やNotePad++でまったくタブ切替時のラグが起きないので (意図的に帯域制限かけてるわけではないので、そのあたりの低速具合がこちらの環境の方が緩いのかもですが)、一体なにが違うのだろう??…と調べていたら、原因わかりました。EditorConfigプラグインだったようです。

    たまたま、
    https://superuser.com/questions/377547/why-is-notepad-so-slow-when-dealing-with-files-stored-on-a-network-share
    のページに以下の助言があり、そういえば…とMeryのEditorConfigプラグインを無効化してみたら、嘘のようにサクサクになりました。

    > If tab switching is still very slow despite having disabled "File Status Auto-Detection", check whether you have the plugin EditorConfig.
    > Removing that extension solved the problem for me. More details on this GitHub issue.

    EditorConfigっておそらく階層遡りとかもあるでしょうし、そのへんの挙動によるものでしょうかね。NotePad++でも、EditorConfigプラグインをインストールした途端、タブ切替時に遅くなりました。(Mery + EditorConfig よりはコンマ数秒速いかなぁ、という感じ)
    でも秀丸だとEditorConfig ONでも気になるようなラグがないので、なんらか読み込みタイミングなど調整されているのかもしれませんね。

    EditorConfigも時折使っていたのですが、ネットワーク共有上のテキストファイルを扱うことのほうが多いですし、ひとまずEditorConfigを無効化で対処することとします。

     |  yuko  |  返信
  4. 秀丸 9.23 で確認したところ、ファイルオープン時にのみ、.editorconfig を検出しているようでした。
    よくよく考えれば .editorconfig って同じフォルダ配下のファイル群のフォーマットを揃えたいがための設定であり、一度設定を作り込んだらあまり手を加えない代物ですし、こういった読み込みパフォーマンスの兼ね合いからそういう割り切りでもいいのかもしれませんね。

     |  yuko  |  返信
  5. ご確認ありがとうございます。なんと、原因は EditorConfig でしたか…

    > 意図的に帯域制限かけてるわけではないので、そのあたりの低速具合がこちらの環境の方が緩いのかもですが

    そう言われてみるとそうですね。

    こちらの検証環境では、更新チェックは帯域制限だけではあまり遅くなかったので、遅延制御で 500ms ほど応答を遅延させて、ようやく現象が確認できたのでした。

    どれだけ遅い回線なのだろう…とは思いつつ😅

    > EditorConfigっておそらく階層遡りとかもあるでしょうし、そのへんの挙動によるものでしょうかね。

    最悪、ルートフォルダーまで探索しに行ってしまいますから、それはありえますね。

    > 秀丸 9.23 で確認したところ、ファイルオープン時にのみ、.editorconfig を検出しているようでした。

    なるほど、検証にご協力いただきありがとうございます。

    > 一度設定を作り込んだらあまり手を加えない代物ですし

    そうですよね。.editorconfig 検出のタイミングは Mery でも以前はファイルを開いたときと保存したときのみでしたが、EditorConfig プラグインの Ver 1.0.2 から、タブ切り替え時もチェックするようにしました。

    当時は EditorConfig に対応したエディターが少なかったため、おそらく Notepad++ を参考にしたのだと思います。

    ご推察のとおり、.editorconfig ファイルが変更された場合の対応だと思いますが、それほど頻繁に変更されることはないでしょうね。

    私も他のエディターで確認してみました。

    E〇Editor さんと Sublime Text も、ファイルを開いたときにのみチェックしているようですね。

    VSCode はタブを切り替えたり、ウィンドウがアクティブになったときにもチェックしているようですが、バックグラウンドで動作しているようで、UI はフリーズせず、検出に時間がかかる場合は、編集中に突然適用されることもあるようです。

    > こういった読み込みパフォーマンスの兼ね合いからそういう割り切りでもいいのかもしれませんね。

    確かに、.editorconfig の設定を即座に反映させたい場面もあるでしょうが、日常的な使用では、タブを切り替えるたびに .editorconfig をチェックする必要はなさそうですね。

    .editorconfig を再適用したい場合は、[読み直し] を実行していただければ…、なんて思いましたが、現在の Mery の仕様では、[読み直し] の際に [ファイルを開いた時] のイベントは発生しないようです。

    となると、.editorconfig 検出のタイミングは [開く] か [保存] のときだけ、ということになってしまいます。

    というわけで、EditorConfig プラグイン側ではタブ切り替え時のチェックを削除し、本体側では [読み直し] 時に [ファイルを開いた時] のイベントを発生させるようにするのが良さそうですね。

    次のバージョンで対応できると思うので今しばらくお待ちくださいませ。

     |  Kuro  |  返信
  6. ありがとうございます!
    次のバージョンを楽しみにお待ちしていますね😉

     |  yuko  |  返信
  7. お待たせしております。次のバージョンは、現在テストを行いながら機能紹介記事の作成を進めていますが、アップデート内容が非常に多くて時間がかかっています…😣

    とりあえず、EditorConfig のほうは修正が完了したので更新しておきました。

    https://www.haijin-boys.com/wiki/プラグイン:EditorConfig

    タブ切り替え時のチェックの削除や、ワークスペースの復元時に EditorConfig が適用されなかった問題の改善などが含まれています。

     |  Kuro  |  返信
  8. > お待たせしております。次のバージョンは、現在テストを行いながら機能紹介記事の作成を進めていますが、アップデート内容が非常に多くて時間がかかっています…😣

    一番だる~い作業の真っ最中とのことで、お疲れさまです。

    別のスレで上がっていたキャレット左側のカッコの強調の要望も、言われてみれば「あー、確かに時々左側も対象にしてほしいときはあったなぁ」と思いあたり。次のバージョンではそれも導入される予感がしていて、何かと楽しみだったりしています。

    > とりあえず、EditorConfig のほうは修正が完了したので更新しておきました。

    ありがとうございます🎉
    アップデートして、しばらく様子を見てみようと思います。
    ちなみにステータスバーに適用表示されるようになったのも地味に嬉しい改善でした。

     |  yuko  |  返信
  9. > 一番だる~い作業の真っ最中とのことで、お疲れさまです。

    お気遣いいただきありがとうございます。ようやくリリースできましたが、バグが心配です😱

    > 別のスレで上がっていたキャレット左側のカッコの強調の要望も、言われてみれば「あー、確かに時々左側も対象にしてほしいときはあったなぁ」と思いあたり。次のバージョンではそれも導入される予感がしていて、何かと楽しみだったりしています。

    鋭い観察ですね。実は、私もちょうど [対応する括弧へ移動] を開発中で、ついでにこのご要望も対応しようと考えましたが、実装が思った以上に難航し、思いの外大きな案件になってしまいました。

    > ちなみにステータスバーに適用表示されるようになったのも地味に嬉しい改善でした。

    おお、気付いていただけて嬉しいです。さらに、Mery Ver 3.6.1 では [名前を付けて保存] と [読み直し] でも .editorconfig が適用されるようになるので、それも小さな改善点です。

    そういえば、以前からマルチ カーソルで連番を付ける機能が欲しいと思っていまして、Ver 3.6.1 では、サンプル マクロに [番号を挿入] マクロを追加しましたが、まさか同じアイデアがこのタイミングで重なるとは思いませんでした😅 (私の実装は低機能ですが…)

     |  Kuro  |  返信
  10. Kuroさん

    > お気遣いいただきありがとうございます。ようやくリリースできましたが、バグが心配です😱

    リリース、大変お疲れさまでした。
    今回はビッグアップデートですね~!(バージョンはパッチバージョン風の上がり方ではありますがw)

    私得なアップデートばかりでワクワクしながら各機能を試しているところです。
    普段VSCodeで使っているマルチキーショートカットが同じノリで使えるのは本当に快適です。ありがとうございます。

    Alt+矢印キーの機能制限も、とうとう乗り越えられたとのことで、おめでとうございます。早速、「次の変更行/前の変更行」に設定してみました。WinMergeの差分箇所へのスキップ遷移のような感じで、なかなか良きでした。

    ショートカットの大拡充も思わぬアプデでありがたさしかありません。
    VSCode風な折返しとインデントが考慮された先頭・末尾移動であったり、括弧の移動であったり… 今までマクロで対応してはいたのですが、このあたりのマクロの登録数を大きく削ることができました。(Shiftキー考慮すると、同じようなマクロを2つ登録しなきゃだったので…)

    > 鋭い観察ですね。実は、私もちょうど [対応する括弧へ移動] を開発中で、ついでにこのご要望も対応しようと考えましたが、実装が思った以上に難航し、思いの外大きな案件になってしまいました。

    こちらも今のところ快調です。
    対応する括弧内を選択する機能は何気に高機能ですね。カーソル位置が括弧の中か、外かで選択範囲がいい感じの範囲に微調整されていて、使い勝手が良さそうです。

    > そういえば、以前からマルチ カーソルで連番を付ける機能が欲しいと思っていまして、Ver 3.6.1 では、サンプル マクロに [番号を挿入] マクロを追加しましたが、まさか同じアイデアがこのタイミングで重なるとは思いませんでした😅 (私の実装は低機能ですが…)

    考えることは同じだったようで、驚きましたw
    開始値の指定くらいできれば用途のほとんどが満ち足りそうですし、実用上はサンプルマクロの内容くらいで十分だと思いますけれどね。これでマルチカーソルで項番なんかがいい具合に振れるようになるので、機能の活用サンプルでもあるサンプルマクロとしては、かなり良さげだと思います。

     |  yuko  |  返信
  11. 早速、お試しいただきありがとうございます。

    > リリース、大変お疲れさまでした。
    > 今回はビッグアップデートですね~!(バージョンはパッチバージョン風の上がり方ではありますがw)

    ありがとうございます! Windows 8 と 8.1 ほどではありませんが、ほぼすべての余暇時間を費やしてしまいました~😣

    > 普段VSCodeで使っているマルチキーショートカットが同じノリで使えるのは本当に快適です。

    そう言っていただけて嬉しいです。開発を進めていると、ショートカットが使いやすい位置にあることの重要性を感じますね。

    たとえば、[大文字に変換] が Shift + Ctrl + U に設定されていたときは、少し手間がかかると感じていましたが、Ctrl + K, Ctrl + U だと気持ちよく使えるようになりました😊

    > Alt+矢印キーの機能制限も、とうとう乗り越えられたとのことで、おめでとうございます。

    実際には、Alt + 方向キーの制限を完全に克服したわけではありません。

    Alt + 方向キーはフリー カーソル モードでカーソルを移動するためのもので、今回追加したコマンドにはそれらが含まれていないため、Alt + 方向キーにショートカットを割り当てると、本来のフリー カーソル モードが使用できなくなります。

    Shift + Alt + 方向キーで列選択 (矩形選択) のコマンドは用意しましたが、フリー カーソル モードは需要が少なかったため、コマンドは省略しました。(コマンドが増えすぎると複雑になるためでもあります)

    > 対応する括弧内を選択する機能は何気に高機能ですね。カーソル位置が括弧の中か、外かで選択範囲がいい感じの範囲に微調整されていて、使い勝手が良さそうです。

    そうなんですよね。選択範囲を括弧の内側にするか外側にするかは賛否が分かれそうで、ちょっと怯えていますが😱

    ちなみに、VSCode は外側固定 (オプションで変更はできるみたい)、Sublime Text では実行するたびに内側 → 外側 → 外側と拡張 (やりすぎると奇妙な選択がされることもありますが) していく感じでした。

    > 開始値の指定くらいできれば用途のほとんどが満ち足りそうですし、実用上はサンプルマクロの内容くらいで十分だと思いますけれどね。

    そう言っていただけると嬉しいです。私も、Mery の開発でコマンドに ID (連番) を振ることが頻繁にあり、いつも Excel を使っていたので、このマクロを作ろうと思い立ちましたが、yuko さんのツイートを見て、レベル 5 のテレパスかと思いましたw

     |  Kuro  |  返信
スポンサーリンク