コンテンツにスキップ

ミニプログラムのパフォーマンス問題分析

本ドキュメントでは、@cloudcare/rum-miniapp 2.2.18 以降で収集されるページパフォーマンスフィールドと、それらを用いて初回レンダリングの遅延やページ終了前の未レンダリングなど、ホワイトスクリーンが疑われる問題を特定する方法について説明します。すべての所要時間フィールドは、Guanceに報告された後、ナノ秒(ns)に統一されます。

収集範囲

SDK は以下のパフォーマンスシグナルを収集できます。

  • ページロード、onReady、初回レンダリング、FP、FCP、LCP
  • ページ終了時に onReady またはプラットフォームの初回レンダリングシグナルがトリガーされたかどうか
  • setData の回数、累計所要時間、最大所要時間、キューイング時間、更新時間、マージ回数
  • 起動試行、ネイティブ起動、スクリプト実行、コードパッケージダウンロード
  • 遅いページに関連する Resource および Error データ

SDK はスクリーンショットを収集せず、ビジネススケルトン画面以降のコアコンテンツが利用可能かどうかを判断することもできません。したがって、特定のパフォーマンスフィールドが欠落していることをもって、直ちにホワイトスクリーンと断定することはできません。

プラットフォームパフォーマンスデータ

SDK は、ミニプログラムプラットフォームが提供する Performance API を優先的に使用します。Observer が正常にサブスクライブされると performance_supported=true となり、プラットフォームが利用可能な初回レンダリングシグナルも同時に提供する場合、first_render_supported=true となります。

WeChat ミニプログラム

WeChat 形式の entry は、以下の指標に直接マッピングされます。

Performance entry RUM フィールド
navigation.duration loading_time
render:firstRender.duration first_render_time
render:firstPaint.startTime - navigationStart page_fp
render:firstContentfulPaint.startTime - navigationStart page_fcp
render:largestContentfulPaint.startTime - navigationStart page_lcp

コールドスタート時の appLaunch と通常の route navigation は、どちらも初回画面のページ ID を確立できます。SDK は route、pageId、および最新の navigationStart に基づいて現在のページインスタンスを選択します。paint が navigation より先に到着した場合は一時的に保存され、entry の絶対 startTime が所要時間として誤って扱われるのを防ぎます。

Douyin ミニプログラム

Douyin は paintevaluatenavigationresourcelaunch の entry を使用します。SDK はこれらをまず統一された基準に変換します。

Douyin entry 統一基準
paint:first-paint page_fpfirst_render_time
paint:first-contentful-paint page_fcp
paint:largest-contentful-paint page_lcp
evaluate:app-service action_type=script_insert
resource:miniprogram-package action_type=package_download

Douyin には WeChat のような firstRender entry がないため、SDK は現在のページの first-paint - navigationStart をそのプラットフォームにおける初回レンダリングシグナルとして使用します。この基準は FCP やビジネスコンテンツの利用可能性と同等ではありません。

View パフォーマンスフィールド

機能とライフサイクル属性

フィールド 説明
performance_supported boolean 現在のプラットフォームで Performance Observer が正常にサブスクライブされたかどうか
first_render_supported boolean 現在のプラットフォームに SDK が利用可能な初回レンダリングシグナルが存在するかどうか
view_start_reason string page_loadpage_show、または session_renewal
view_end_reason string onHideonUnload、または session_renewal
ready_reached boolean 現在のページのライフサイクルが onReady に達したかどうか
first_render_reached boolean 現在のページがプラットフォームの初回レンダリングシグナルを受信したかどうか
ended_before_ready boolean page_load View が終了した時点でまだ onReady に達していないかどうか
ended_before_render boolean 初回レンダリングシグナルがサポートされている場合、page_load View が初回レンダリング前に終了したかどうか
view_is_active boolean View がまだアクティブ状態かどうか

ended_before_renderfirst_render_supported=true の場合にのみ統計的に意味を持ちます。セッション更新は RUM View を分割するだけで、ページの再読み込みを意味するわけではないため、ページの早期終了という結論は生成されません。

レンダリング所要時間

フィールド 説明
loading_time ページ navigation とライフサイクルで観測された最大ロード時間
page_ready_time View 開始から onReady までの所要時間
first_render_time WeChat の firstRender.duration、Douyin の first-paint - navigationStart
page_fp 現在のページの navigationStart を基準とした FP の所要時間
page_fcp 現在のページの navigationStart を基準とした FCP の所要時間
page_lcp 現在のページの最新の LCP の navigationStart を基準とした所要時間
first_render_data_transfer_time 初回レンダリング初期化データの受信時間から送信時間を引いた値
first_render_wait_time データ受信完了からビューレイヤーがレンダリングを開始するまでの待機時間
first_render_view_layer_time ビューレイヤーの初回レンダリング所要時間

first_paint_timefirst_render_time は互換性フィールドであり、どちらも SDK が選択した初回レンダリングシグナルを示します。実際の FP を分析する必要がある場合は page_fp を使用してください。

setData 所要時間

フィールド 説明
view_setdata_count 有効な setData 更新サンプル数
view_setdata_duration すべての有効な更新の累計所要時間
view_setdata_max_duration 単一更新の最大所要時間
view_setdata_pending_duration キューに入ってから更新が開始されるまでの累計待機時間
view_setdata_update_duration 更新開始から終了までの累計実行時間
view_setdata_merged_count プラットフォームによってマージされて処理された更新回数

SDK は、listener がインストールされた時点の所属ページを記録します。非表示ページや古いコンポーネントからの遅延コールバックは現在の View にカウントされず、ページのアンロードやコンポーネントの分離後はリスニングが停止されます。

起動段階の指標

起動段階は action データとして報告されます。

action_type 説明
launch_attempt 最初の App.onLaunch 到達。SDK インスタンスごとに 1 回。duration は書き込まれず、app_launch_attempt=true が有効なフィールドとなります。
launch プラットフォームの appLaunch navigation duration
script_insert スクリプト実行所要時間
package_download ミニプログラムコードパッケージのダウンロード所要時間

後者の 3 つはプラットフォームの Performance entry に依存します。launch / launch_attempt の比率を使用してネイティブ起動指標のカバレッジを観察することを推奨します。entry がないことを所要時間ゼロと見なさないでください。

ホワイトスクリーン候補の統計

ホワイトスクリーン分析は、カバレッジ、遅延レンダリング、早期終了の 3 つのカテゴリの指標に分割することを推奨します。

統計サンプル

まず以下の条件でフィルタリングします。

view_start_reason = page_load
performance_supported = true
first_render_supported = true

初回レンダリングシグナルをサポートしていないプラットフォームは、カバレッジを個別に統計し、ended_before_render の分母には含めないでください。

推奨基準

問題 推奨条件 説明
初回レンダリングの遅延 first_render_time がビジネス閾値を超える P75、P95、および閾値超過率の統計に適しています
終了前の初回レンダリング未完了 ended_before_render=true 信頼度の高いホワイトスクリーン候補ですが、ユーザーが意図的に素早く戻った場合も該当することがあります
Ready までの長時間未達 page_ready_time が閾値を超える ページのライフサイクルまたは初期化のブロッキングを反映しますが、視覚的なホワイトスクリーンと同等ではありません
終了前の Ready 未到達 ended_before_ready=true view_end_reason と滞在時間を組み合わせて、素早い離脱を除外する必要があります
FCP/LCP の遅延 page_fcp または page_lcp が閾値を超える コンテンツの出現と主要コンテンツの安定時間に近い指標です

推奨ダッシュボードには、少なくとも以下を含めてください。

  1. Performance と初回レンダリングシグナルのカバレッジ
  2. FP、FCP、LCP、firstRender の P50、P75、P95
  3. ended_before_renderended_before_ready の比率
  4. 遅い View の Error、失敗 Resource、5xx、TTFB の分布
  5. アプリケーションバージョン、プラットフォーム、OS、デバイスモデルごとに分類したトレンド

既知の制限事項

  • SDK にはビジネス的な markViewReady() API がなく、コアビジネスコンテンツが利用可能であることを確認できません。
  • Page onLoad 前に発生した致命的なエラーには View Context がない可能性があります。
  • 現時点では Long Task、FPS、ページフリーズ、スクリーンショットは収集されません。
  • プラットフォームの Performance API、基本ライブラリ、OS バージョンの違いにより、フィールドのカバレッジに影響が出る可能性があります。
  • データ送信失敗時のリトライやローカル永続化がない場合、ネットワーク環境が悪いと問題の比率が過小評価される可能性があります。

公式リファレンス

フィードバック

このページは役に立ちましたか?