<Profiler> を使うことで、React ツγƒͺγƒΌοΏ½?レンダγƒͺγƒ³γ‚°γƒ‘γƒ•γ‚©γƒΌγƒžγƒ³γ‚Ήγ‚’γƒ—γƒ­γ‚°γƒ©γƒ γ§ζΈ¬οΏ½?οΏ½γ™γ‚‹γ“γ¨γŒγ§γγΎγ™γ€‚

<Profiler id="App" onRender={onRender}>
<App />
</Profiler>

γƒͺフゑレンス

<Profiler>

γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγƒ„γƒͺγƒΌγ‚’ <Profiler> でラップすることで、レンダー�?γƒ‘γƒ•γ‚©γƒΌγƒžγƒ³γ‚Ήγ‚’ζΈ¬οΏ½?οΏ½γ™γ‚‹γ“γ¨γŒγ§γγΎγ™γ€‚

<Profiler id="App" onRender={onRender}>
<App />
</Profiler>

props

  • id: UI οΏ½?ど�?ιƒ¨εˆ†γ‚’ζΈ¬οΏ½?�対豑としている�?γ‹θ­˜εˆ₯γ™γ‚‹γŸγ‚οΏ½?ζ–‡ε­—εˆ—γ§γ™γ€‚
  • onRender: プロフゑむγƒͺング対豑�?ツγƒͺγƒΌε†…οΏ½?γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγŒζ›΄ζ–°γ•γ‚Œγ‚‹γŸγ³γ« React γŒε‘Όγ³ε‡Ίγ™ onRender γ‚³γƒΌγƒ«γƒγƒƒγ‚―γ€‚δ½•γŒγƒ¬γƒ³γƒ€γƒΌγ•γ‚Œγ€γγ‚Œγ«γ©γ‚Œγ γ‘οΏ½?ζ™‚ι–“γŒγ‹γ‹γ£γŸγ‹γ«γ€γ„γ¦οΏ½?ζƒ…ε ±γ‚’ε—γ‘ε–γ‚ŠγΎγ™γ€‚

注意点


onRender コールバック

React は onRender γ‚³γƒΌγƒ«γƒγƒƒγ‚―γ‚’ε‘Όγ³ε‡Ίγ—γ¦γ€δ½•γŒγƒ¬γƒ³γƒ€γƒΌγ•γ‚ŒγŸγ‹γ«γ€γ„γ¦οΏ½?ζƒ…ε ±γ‚’δΌγˆγΎγ™γ€‚

function onRender(id, phase, actualDuration, baseDuration, startTime, commitTime) {
// Aggregate or log render timings...
}

εΌ•ζ•°

  • id: γŸγ£γŸδ»Šγ‚³γƒŸγƒƒγƒˆγ•γ‚ŒγŸγƒ„γƒͺγƒΌγ«ε―ΎεΏœγ™γ‚‹ <Profiler> οΏ½? id プロパティ。耇数�?γƒ—γƒ­γƒ•γ‚‘γ‚€γƒ©γ‚’δ½Ώη”¨γ—γ¦γ„γ‚‹ε ΄εˆγ«γ€γ©οΏ½?ツγƒͺγƒΌγŒγ‚³γƒŸγƒƒγƒˆγ•γ‚ŒγŸγ‹γ‚’γ“γ‚Œγ«γ‚ˆγ‚Šθ­˜εˆ₯できます。
  • phase: "mount"、"update"γ€γΎγŸγ― "nested-update"γ€‚γ“γ‚Œγ«γ‚ˆγ‚Šγ€γƒ„γƒͺγƒΌγŒεˆγ‚γ¦γƒžγ‚¦γƒ³γƒˆγ•γ‚ŒγŸοΏ½?か、props、stateγ€γΎγŸγ―γƒ•γƒƒγ‚―οΏ½?ε€‰ζ›΄γ«γ‚ˆγ‚Šε†γƒ¬γƒ³γƒ€γƒΌγ•γ‚ŒγŸοΏ½?かをηŸ₯γ‚‹γ“γ¨γŒγ§γγΎγ™γ€‚
  • actualDuration: 現在�?ζ›΄ζ–°οΏ½?γŸγ‚γ« <Profiler> とそ�?ε­θ¦η΄ γŒγƒ¬γƒ³γƒ€γƒΌγ«θ²»γ‚„γ—γŸγƒŸγƒͺη§’ζ•°γ€‚γ“γ‚Œγ―γ€γ‚΅γƒ–γƒ„γƒͺγƒΌγŒγƒ‘γƒ’εŒ–οΌˆδΎ‹οΌšmemo と useMemoοΌ‰γ‚’γ©γ‚Œγ γ‘γ†γΎγεˆ©η”¨γ§γγ¦γ„γ‚‹γ‹γ‚’η€Ίγ™γ‚‚οΏ½?γ§γ™γ€‚η†ζƒ³ηš„γ«γ―γ€ε­θ¦η΄ οΏ½?倚くがθ‡ͺθΊ«οΏ½? props γŒε€‰ζ›΄γ•γ‚ŒγŸε ΄εˆγ«οΏ½?γΏε†γƒ¬γƒ³γƒ€γƒΌγ•γ‚Œγ‚‹γ‚ˆγ†γ«γͺることで、こ�?ε€€γ―εˆε›žγƒžγ‚¦γƒ³γƒˆεΎŒγ«ε€§εΉ…γ«ζΈ›ε°‘γ—γ¦γ„γγ―γšγ§γ™γ€‚
  • baseDuration: γ‚‚γ—ζœ€ι©εŒ–γͺしで <Profiler> ァブツγƒͺγƒΌε…¨δ½“γ‚’ε†γƒ¬γƒ³γƒ€γƒΌγ—γŸε ΄εˆγ«γ‹γ‹γ‚‹ζ™‚ι–“γ‚’γƒŸγƒͺη§’γ§ζŽ¨οΏ½?οΏ½γ—γŸζ•°ε€€γ€‚γƒ„γƒͺγƒΌε†…οΏ½?ε„γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆοΏ½?ζœ€εΎŒοΏ½?γƒ¬γƒ³γƒ€γƒΌγ«γ‹γ‹γ£γŸζ™‚ι–“γ‚’εˆθ¨ˆγ™γ‚‹γ“γ¨γ§θ¨ˆοΏ½?οΏ½γ•γ‚ŒγΎγ™γ€‚γ“οΏ½?ε€€γ―γ€ζœ€ζ‚ͺοΏ½?ツγƒͺγƒΌοΏ½?γƒ¬γƒ³γƒ€γƒΌγ‚³γ‚ΉγƒˆοΌˆδΎ‹οΌšεˆε›žγƒžγ‚¦γƒ³γƒˆγ‚„γƒ‘γƒ’εŒ–γŒγͺγ„ε ΄εˆοΌ‰γ‚’ζŽ¨οΏ½?οΏ½γ—γΎγ™γ€‚γƒ‘γƒ’εŒ–γŒζ©Ÿθƒ½γ—γ¦γ„γ‚‹γ‹γ©γ†γ‹γ‚’η’Ίθͺγ™γ‚‹γ«γ―、こ�?ε€€γ‚’ actualDuration と比較します。
  • startTime: React が現在�?ζ›΄ζ–°οΏ½?γƒ¬γƒ³γƒ€γƒΌγ‚’ι–‹ε§‹γ—γŸζ™‚εˆ»οΏ½?タむムスタンプ。
  • commitTime: React が現在�?ζ›΄ζ–°γ‚’γ‚³γƒŸγƒƒγƒˆγ—γŸζ™‚εˆ»οΏ½?タむムスタンプ。こ�?ε€€γ―ε˜δΈ€γ‚³γƒŸγƒƒγƒˆε†…οΏ½?すべて�?γƒ—γƒ­γƒ•γ‚‘γ‚€γƒ©ι–“γ§ε…±ζœ‰γ•γ‚Œγ‚‹γŸγ‚γ€εΏ…θ¦γ«εΏœγ˜γ¦γ‚°γƒ«γƒΌγƒ—εŒ–γ™γ‚‹γŸγ‚γ«εˆ©η”¨γ§γγΎγ™γ€‚

使用法

レンダー�?γƒ‘γƒ•γ‚©γƒΌγƒžγƒ³γ‚Ήγ‚’γƒ—γƒ­γ‚°γƒ©γƒ γ§ζΈ¬οΏ½?�する

React ツγƒͺγƒΌγ‚’ <Profiler> γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ§ε›²γ‚€γ“γ¨γ§γ€γοΏ½?レンダー�?γƒ‘γƒ•γ‚©γƒΌγƒžγƒ³γ‚Ήγ‚’ζΈ¬οΏ½?�します。

<App>
<Profiler id="Sidebar" onRender={onRender}>
<Sidebar />
</Profiler>
<PageContent />
</App>

idοΌˆζ–‡ε­—εˆ—οΌ‰γ¨ onRender γ‚³γƒΌγƒ«γƒγƒƒγ‚―οΌˆι–’ζ•°οΌ‰οΏ½? 2 ぀�? props γŒεΏ…θ¦γ§γ™γ€‚React はツγƒͺγƒΌε†…οΏ½?γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγŒζ›΄ζ–°γ‚’γ€Œγ‚³γƒŸγƒƒγƒˆγ€γ™γ‚‹γŸγ³γ«γ“γ‚Œγ‚’ε‘Όγ³ε‡Ίγ—γΎγ™γ€‚

落とし穴

プロフゑむγƒͺγƒ³γ‚°γ«γ―θΏ½εŠ οΏ½?γ‚ͺγƒΌγƒγƒΌγƒ˜γƒƒγƒ‰γŒη™Ίη”Ÿγ™γ‚‹γŸγ‚γ€γƒ‡γƒ•γ‚©γƒ«γƒˆγ§γ―ζœ¬η•ͺη”¨γƒ“γƒ«γƒ‰γ§γ―η„‘εŠΉγ«γͺγ£γ¦γ„γΎγ™γ€‚ζœ¬η•ͺ環咃でプロフゑむγƒͺγƒ³γ‚°γ‚’θ‘Œγ†γŸγ‚γ«γ―γ€γƒ—γƒ­γƒ•γ‚‘γ‚€γƒͺγƒ³γ‚°γ‚’ζœ‰εŠΉγ«γ—γŸγͺη‰Ήεˆ₯γͺ本η•ͺη”¨γƒ“γƒ«γƒ‰γ‚’ζ˜Žη€Ίηš„γ«η”¨γ„γ‚‹εΏ…θ¦γŒγ‚γ‚ŠγΎγ™γ€‚

補袳

<Profiler> を使うことで測�?οΏ½η΅ζžœγ‚’γƒ—γƒ­γ‚°γƒ©γƒ γ§εŽι›†γ™γ‚‹γ“γ¨γŒγ§γγΎγ™γ€‚ε―Ύθ©±εž‹οΏ½?γƒ—γƒ­γƒ•γ‚‘γ‚€γƒ©γ‚’δ½Ώγ„γŸγ„ε ΄εˆγ―γ€React Developer Tools οΏ½? Profiler γ‚Ώγƒ–γ‚’θ©¦γ—γ¦γΏγ¦γγ γ•γ„γ€‚γ“γ‚Œγ―εŒζ§˜οΏ½?ζ©Ÿθƒ½γ‚’γƒ–γƒ©γ‚¦γ‚ΆοΏ½?ζ‹‘εΌ΅ζ©Ÿθƒ½γ¨γ—γ¦ζδΎ›γ—γΎγ™γ€‚


γ‚’γƒ—γƒͺケーション�?耇数部位を測�?�する

γ‚’γƒ—γƒͺケーション�?耇数�?部位を測�?οΏ½γ™γ‚‹γŸγ‚γ«γ€θ€‡ζ•°οΏ½? <Profiler> γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’δ½Ώη”¨γ™γ‚‹γ“γ¨γŒγ§γγΎγ™γ€‚

<App>
<Profiler id="Sidebar" onRender={onRender}>
<Sidebar />
</Profiler>
<Profiler id="Content" onRender={onRender}>
<Content />
</Profiler>
</App>

γΎγŸγ€<Profiler> γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’γƒγ‚Ήγƒˆγ™γ‚‹γ“γ¨γ‚‚γ§γγΎγ™γ€‚

<App>
<Profiler id="Sidebar" onRender={onRender}>
<Sidebar />
</Profiler>
<Profiler id="Content" onRender={onRender}>
<Content>
<Profiler id="Editor" onRender={onRender}>
<Editor />
</Profiler>
<Preview />
</Content>
</Profiler>
</App>

<Profiler> は軽量γͺγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ§γ™γŒγ€εΏ…θ¦γͺ場合に�?γΏδ½Ώη”¨γ™γ‚‹γΉγγ§γ™γ€‚δ½Ώη”¨γ™γ‚‹γŸγ³γ«γ‚’γƒ—γƒͺケーションに一�?οΏ½οΏ½? CPU とパヒγƒͺοΏ½?γ‚ͺγƒΌγƒγƒΌγƒ˜γƒƒγƒ‰γŒη”Ÿγ˜γΎγ™γ€‚