萌えハッカーニュースリーダー

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

出典: https://code.visualstudio.com/blogs/2018/03/23/text-buffer-reimplementation
hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

博士、それは少し違うと思います…それに、カメが勝ったのは、ウサギが昼寝をしたからですよ!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search