3 ポイント 投稿者 GN⁺ 2024-08-28 | 1件のコメント | WhatsAppで共有

5000倍高速なCRDT:最適化の冒険

はじめに

  • 数年前、フランスの研究者たちがリアルタイム共同編集アルゴリズムを比較した論文を発表した
  • 複数のアルゴリズムを実装し、性能をベンチマークした
  • 一部のアルゴリズムは、単純な貼り付け操作に3秒以上かかった
  • 問題のアルゴリズムはShareJSで使われていたものだった

問題の原因

  • 論文では大きなテキストを貼り付ける際、1000個の個別操作に分割して処理していた
  • これはアルゴリズム自体の問題ではなく、実装の問題だった

CRDTの魅力

  • CRDT(Conflict-Free Replicated Data Types)は、複数のユーザーが同時にデータを編集できるようにする
  • ローカルで遅延なく作業でき、同期時には自動的に一貫性を維持する
  • 中央サーバーなしでも動作可能

Automergeの問題点

  • Automergeは共同編集のためのライブラリで、RGAアルゴリズムをベースにしている
  • 各ドキュメントの文字を一意のIDで管理し、挿入時には親項目を指定する
  • 性能上の問題により、260,000件の編集操作を処理するのに5分かかった
  • メモリ使用量も非常に大きい

性能最適化

  • Automergeの性能問題は、複雑なツリーベースのデータ構造とImmutablejsの使用に起因していた
  • Yjsは単一のフラットなリストを使うことで性能を大幅に向上させた
  • Yjsは挿入位置を見つけるためにキャッシュを使い、双方向連結リストを使って挿入を効率的に処理する
  • Yjsは30倍高速で、メモリ使用量も少ない

Rustへの移行

  • Rustはメモリレイアウトを制御できるため、性能をさらに向上させられる
  • Diamond typesという新しいCRDT実装により、Yjsより5倍高速な性能を達成した
  • Rustで実装されたDiamondは、260,000件の編集操作をわずか56ミリ秒で処理する

結論

  • 最適化されたデータ構造と効率的なメモリ管理によって、CRDTの性能を大幅に向上できる
  • Rustのような低レベル言語を使えば、さらに高速な性能を実現できる

GN⁺のまとめ

  • CRDTは共同編集の未来であり、中央サーバーなしでも一貫性を維持できる強力なツールである
  • Automergeの性能問題は、複雑なデータ構造と非効率なメモリ使用にあった
  • YjsとDiamond typesは、単純で効率的なデータ構造を使って性能を大きく向上させている
  • Rustのような低レベル言語を使えば、さらに高速な性能を実現できる
  • 共同編集ツールを開発する際は、YjsとDiamond typesを検討する価値がある

1件のコメント

 
GN⁺ 2024-08-28
Hacker Newsのコメント
  • 32個のエントリが最も効率的な理由は、キャッシュラインが64バイトだから

    • 2バイト整数を使う場合、32個のエントリがちょうど1本のキャッシュラインに収まり、メインメモリ転送を減らせる
  • CRDTを使う実際のアプリケーションで、優れた体験を提供している例を見つけるのは難しい

    • Notionは、2人が同時にノートを書くとき、Google Docsと比べて使い勝手が劣る
  • CRDTは強力だが、履歴上の操作(または要素)を残してしまう欠点がある

    • 圧縮を使ってもなお欠点として作用し、採用に対する懸念がある
    • それでも、ファイルベースのストレージプロバイダー(Dropbox、Syncthingなど)で競合のないアルゴリズムを実装できる可能性には興味を感じる
  • 現在のGitHub Readmeからの引用:

    • ブログ記事以降、性能は10〜80倍向上した
  • この記事は内容が難しくてもよく書かれていて、読むのをやめられなかった

  • 階層構造を使っているのを見て、入れ子集合を代わりに使ったのか気になった

    • 読み取り操作での利点が、挿入操作での損失を相殺できるのかについては見当がつかない
  • 数年前にこの投稿を偶然見つけた

    • ここ数年で最も面白かった投稿の一つ
  • WASMがネイティブ実行より4倍遅い理由が気になる

    • すべての文字列操作がWASMメモリにコピーされ、結果の計算後に再びJSへコピーされなければならないからだと思った
    • この文脈を誤解しているのではないかと気になる
  • AutomergeのRust実装が完了したので、更新されたベンチマークを見るのは興味深いだろう