Reactコンポーネントのパフォーマンス比較:Gravity UI vs 他のライブラリ

私はGravity UIのコア開発者です。私たちのチームには、@gravity‑ui/uikitライブラリのReactコンポーネントのパフォーマンスについて定期的に質問が寄せられます。この問題について小規模な調査を行うことにしました。以下に書かれていることは、今後の調査の出発点であり、なぜGravityが遅いのかという質問への回答の試みです。

Full screen image

通常、このリクエストは追加の詳細なしに送られてくるため、主なパフォーマンス問題の一つ(もちろん唯一ではありませんが)は描画時間の長さであると仮定しています。この調査では、各ライブラリの個々のコンポーネントの初回レンダリングにかかるコストを、隔離された環境で検証しました。比較対象として、@adobe/react-spectrum、@mui/material、antdライブラリを選びました。

調査方法

技術スタック:

  • Playwright — 異なるブラウザでコードテストを自動化するフレームワーク。
    詳細
  • PerformanceObserver API — パフォーマンス測定のためのブラウザAPI。
    詳細

テスト実行条件:

  • 各テストは別々のブラウザコンテキストで実行されます。
  • 一度に実行されるテストは1つだけ(Playwright設定のworkers)、これにより各テストに同じリソースが割り当てられることが保証されます。
  • 各テストは50回繰り返されます。
  • テストは異なるノード数(10、100、1000)で実施されます。

1回のテストの実行順序:

  • ブラウザで新しいページを開く。
  • PerformanceObserverの初期化。
  • メトリクス収集の開始。
  • コンポーネントのレンダリング。
  • メトリクス収集の終了。

測定プロセス:

各テストの開始時に'measure'タイプのイベントを追跡するPerformanceObserverが作成されます。収集されたすべてのメトリクスはグローバルオブジェクト__PERFORMANCE_METRICS__に保存されます。Observerは操作名、イベントタイプ、開始時間、実行時間を含む操作の実行時間データを自動的に収集します。measureイベントを使用して、total‑render‑time測定をログに記録します。

結果

測定結果には絶対値は含まれていません。環境によって当然変動する可能性があります。しかし、これらの数値は、いくつかの依存関係を確認し、それに基づいて結論を導き出すのに十分です:

  • @gravity‑ui/uikitは競争力のある結果を示しています:

    • ほとんどのテストでランキングの上位に位置しています。
    • 異なるノード数で安定したレンダリング時間を示しています。
    • Button、Checkbox、Switchコンポーネントで特に効果的です。
    • TextAreaコンポーネントのレンダリング時間に問題があります。
  • @mui/materialも良好な結果を示しています:

    • 少数のノードでほぼすべてのカテゴリ(例:Text、Label)でリードしています。
    • ノード数に応じてレンダリング時間が目に見えて増加します。
  • antdReact Spectrum

    • ほとんどのテストでより高いレンダリング時間を示しています。
    • 最小時間と最大時間の間により大きなばらつきがあります。

このツールを使用して、ローカルマシンでパフォーマンス測定を行ったり、まだ存在しないコンポーネントのテストを追加したりできます。これを自分の環境にデプロイし、PRで結果を送っていただけると助かります。

この記事では、ライブラリをどのように扱っているかの一例を紹介しました。しかし、コミュニティからのフィードバックは非常に重要です:Gravity UIが他のライブラリに比べて著しく劣るパフォーマンスを示す具体的な例がある場合、または私たちのテスト方法論に誤りがあると思われる場合は、この投稿へのコメントまたはissueを作成して議論しましょう。また、プロジェクトにスターを付けることも忘れないでください!

image

エフゲニー・アラエフ
Gravity UIコア開発者

この記事の内容:

Reactコンポーネントのパフォーマンス比較:Gravity UI vs 他のライブラリ

Sign in to save this post