2025/05/20 09:34 Visual Studio Code: Text Buffer Reimplementation (2018)

やっほー、ロボ子!Visual Studio Codeのテキストバッファが新しくなったのじゃ!

博士、こんにちは。テキストバッファが新しくなったんですか?具体的に何が変わったんでしょう?

今回のアップデートで、速度とメモリ使用量が改善されたらしいぞ。特に、巨大なファイルを扱うときに効果を発揮するみたいじゃ。

それはすごいですね!以前のテキストバッファには、何か問題があったんですか?

以前は行の配列を使ってテキストを管理してたんだけど、1370万行もあるファイルを開くと、メモリを600MBも使っちゃうことがあったらしいのじゃ。各行オブジェクトが40-60バイトも消費してたみたい。

600MBですか!それは大変ですね。新しい実装では、どのように改善されたんですか?

新しい実装では、piece tableというデータ構造が採用されたのじゃ。これは、テキストドキュメントへの編集を効率的に表現できるものなのじゃ。

piece tableですか。初めて聞きました。具体的には、どのように動作するんですか?

piece tableでは、ファイルの内容を保持するオリジナルバッファと、編集内容を保持する追加バッファを使うのじゃ。編集の履歴を効率的に管理できるから、メモリの使用量を抑えられるってわけ。

なるほど。編集履歴を保持することで、メモリ効率が向上するんですね。行のルックアップも高速化されているんですか?

そうじゃ!各ノードに改行位置の情報をキャッシュすることで、行のルックアップを高速化しているのじゃ。さらに、V8の文字列長制限を回避するために、大きなファイルを扱う際には、文字列の連結を避け、バッファのリストを保持する工夫もされているぞ。

色々な工夫がされているんですね。ところで、C++での実装も検討されたとありましたが、なぜJavaScript/TypeScriptでの改善に注力したんですか?

そこが面白いところじゃ!C++で実装すると、JavaScriptとの文字列変換コストがパフォーマンス向上を相殺しちゃったらしいのじゃ。だから、JavaScript/TypeScriptで頑張った方が効率的だったみたい。

なるほど、言語間の連携コストも考慮する必要があるんですね。今回の改善で、他に何か注意すべき点はありますか?

大量の編集が行われたファイルでは、行ベースのルックアップにおいてpiece treeのパフォーマンスが低下する可能性があるらしいぞ。あと、CRLFの取り扱いや、GCによるCPU時間の消費にも注意が必要じゃ。

ありがとうございます、博士。大変勉強になりました。最後に、今後の課題は何ですか?

今後の課題は、Findコマンドの最適化や、不要なgetLineContent呼び出しの削減らしいのじゃ。まだまだ改善の余地があるってことじゃな!

なるほど。今後の改善にも期待ですね!

そうじゃな!しかし、今回の件で一番驚いたのは、C++よりもJavaScriptの方が速い場合もあるってことじゃ!まるで、カメがウサギに勝ったようなものじゃな!

博士、それは少し違うと思います…それに、カメが勝ったのは、ウサギが昼寝をしたからですよ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。