【実務・中級編】 React Profiler APIによるレンダリング計測 – React実践ガイド

React Profilerで「勘」のパフォーマンスチューニングを卒業する

現場で開発をしていると、必ず一度はぶつかる壁がある。「なぜか画面の描画がもっさりする」「ボタンクリックのレスポンスが悪い」。そんな時、多くのエンジニアがやりがちなのが、`useMemo`や`useCallback`を闇雲に散りばめることだ。

だが、言わせてほしい。計測なき最適化は、ただの「推測」だ。

Reactは非常に優秀だが、その裏側で何が起きているかを知らずに手探りで修正するのは、目隠しをして迷路を走るようなものだ。今日は、React標準の「Profiler API」を使って、ボトルネックを科学的に特定し、迷いのない最適化を行うための極意を伝授しよう。

—

Profiler APIが教えてくれる「真実」

Reactの`Profiler`コンポーネントは、ラップしたツリーのレンダリング時間をミリ秒単位で計測してくれるツールだ。ブラウザのDevToolsで見る「React Profiler」タブも便利だが、プロダクションに近い環境で「どのコンポーネントが何回、なぜ再レンダリングされたのか」を追跡するには、`onRender`コールバックが不可欠だ。

実務で使う `Profiler` の基本形

まずは、特定のコンポーネントツリーを囲むだけで計測が始まる、最もシンプルな実装を見てみよう。

import React, { Profiler } from ‘react’;

const MyPerformanceCriticalComponent = () => {
// 計測用のコールバック関数
// id: ProfilerのID, phase: ‘mount’ または ‘update’
const onRenderCallback = (id, phase, actualDuration, baseDuration, startTime, commitTime) => {
// 開発現場ではここをログに出すだけでなく、DatadogやNew Relicなどの
// RUM(Real User Monitoring)ツールに飛ばすのが定石だ
console.log(`[Profiler: ${id}] phase: ${phase}, duration: ${actualDuration.toFixed(2)}ms`);

// actualDurationが特定の閾値(例えば16ms以上=60fpsを割るライン)を超えたら警告を出すなど
if (actualDuration > 16) {
console.warn(`⚠️ パフォーマンス低下検知: ${id} が ${actualDuration}ms かかっています`);
}
};

return (

{/ ここにレンダリングコストの高いコンポーネントツリーを置く /}


);
};

—

なぜレンダリング時間は「跳ね上がる」のか?

`onRender`で取得できる `actualDuration` が跳ね上がる原因は、大きく分けて二つある。

1. レンダリング回数の爆発: 親コンポーネントのState変更が、本来再レンダリング不要な子コンポーネントまで波及している(`React.memo`の欠如)。
2. 計算負荷の増大: レンダーフェーズ中に重いJSの計算(配列のフィルタリングやソートなど)が走っている。

ここで重要なのは、「何が原因でレンダリングがトリガーされたか」を把握することだ。

現場で役立つ「差分計測」のテクニック

ただ計測するだけでは不十分だ。私は現場で、`useRef`を併用して「前回のレンダリング時との差分」を記録する手法をよく使う。特に複雑なダッシュボードを作っている時は、これが最強のデバッグツールになる。

import { Profiler, useRef } from ‘react’;

const PerformanceTracker = ({ children }) => {
const renderCount = useRef(0);

const onRender = (id, phase, actualDuration) => {
renderCount.current++;
// レンダリング回数が多すぎるコンポーネントを特定する
if (renderCount.current > 5) {
console.debug(`[${id}] レンダリングが5回を超えました。不要な再レンダリングを疑ってください。`);
}
};

return (

{children}

);
};

—

シニアからのアドバイス:最適化の「引き際」を見極めろ

ここまでProfilerの使い方を説明したが、最後に一つだけ、釘を刺しておきたい。

「すべてのコンポーネントをProfilerで囲めばいい」というわけではない。

過剰な計測コードは、それ自体がメモリを食い、実行時の負荷になる。Profilerは、あくまで「疑わしい箇所」にピンポイントで当てるものだ。まずはブラウザのReact DevToolsで、「Highlight updates when components render」をONにして、見た目で明らかに「おかしい動き(不要な光り方)」をしている箇所を探せ。

その上で、Profilerを使って定量的な裏付けを取る。この手順を踏めば、君のプルリクエストは誰からも文句の出ない、説得力のあるものになるはずだ。

パフォーマンスチューニングは、いわば「外科手術」だ。正確な診断なくしてメスを入れるな。まずはProfilerで、君のアプリケーションの「心拍数」を正しく計測するところから始めてみてほしい。

何かあれば、いつでも聞いてくれ。現場の泥臭い課題こそ、Reactを極める最短ルートだからな。

コメント

タイトルとURLをコピーしました