๐ŸŒ AIๆœ็ดข & ไปฃ็† ไธป้กต

<Profiler>๋ฅผ ํ†ตํ•ด React ํŠธ๋ฆฌ์˜ ๋ Œ๋”๋ง ์„ฑ๋Šฅ์„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ์ธก์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋ ˆํผ๋Ÿฐ์Šค

<Profiler>

๋ Œ๋”๋ง ์„ฑ๋Šฅ์„ ์ธก์ •ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ๋ฅผ <Profiler>๋กœ ๊ฐ์‹ธ์ค๋‹ˆ๋‹ค.

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

Props

  • id: ์„ฑ๋Šฅ์„ ์ธก์ •ํ•˜๋Š” UI ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•œ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.
  • onRender: ํ”„๋กœํŒŒ์ผ๋ง๋œ ํŠธ๋ฆฌ ๋‚ด์˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์—…๋ฐ์ดํŠธ๋  ๋•Œ๋งˆ๋‹ค React๊ฐ€ ํ˜ธ์ถœํ•˜๋Š” onRender ์ฝœ๋ฐฑ์ž…๋‹ˆ๋‹ค. ๋ Œ๋”๋ง๋œ ๋‚ด์šฉ๊ณผ ์†Œ์š”๋œ ์‹œ๊ฐ„์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.

Caveats


onRender ์ฝœ๋ฐฑ

React๋Š” onRender ์ฝœ๋ฐฑ์„ ๋ Œ๋”๋ง๋œ ๋‚ด์šฉ๊ณผ ๊ฐ™์ด ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

function onRender(id, phase, actualDuration, baseDuration, startTime, commitTime) {
// ๋ Œ๋”๋ง ์‹œ๊ฐ„ ์ง‘๊ณ„ ํ˜น์€ ๋กœ๊ทธ...
}

๋งค๊ฐœ๋ณ€์ˆ˜

  • id: ์ปค๋ฐ‹๋œ <Profiler> ํŠธ๋ฆฌ์˜ ๋ฌธ์ž์—ด id ํ”„๋กœํผํ‹ฐ์ž…๋‹ˆ๋‹ค. ํ”„๋กœํŒŒ์ผ๋Ÿฌ๋ฅผ ๋‹ค์ค‘์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ํŠธ๋ฆฌ ๋‚ด์—์„œ ์–ด๋–ค ๋ถ€๋ถ„์ด ์ปค๋ฐ‹ ๋˜์—ˆ๋Š”์ง€ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค๋‹ˆ๋‹ค.
  • phase: "mount", "update" ํ˜น์€ "nested-update". ํŠธ๋ฆฌ๊ฐ€ ์ตœ์ดˆ๋กœ ๋งˆ์šดํŠธ๋˜์—ˆ๋Š”์ง€ ๋˜๋Š” Props, State, Hook์˜ ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด ๋ฆฌ๋ Œ๋”๋ง ๋˜์—ˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • actualDuration: ํ˜„์žฌ ์—…๋ฐ์ดํŠธ์— ๋Œ€ํ•ด <Profiler>์™€ ์ž์‹๋“ค์„ ๋ Œ๋”๋งํ•˜๋Š”๋ฐ ์†Œ์š”๋œ ์‹œ๊ฐ„(๋ฐ€๋ฆฌ์ดˆ)์ž…๋‹ˆ๋‹ค. ์ด๋Š” ํ•˜์œ„ ํŠธ๋ฆฌ๊ฐ€ ๋ฉ”๋ชจ์ด์ œ์ด์…˜(์˜ˆ: memo์™€ useMemo)์„ ์–ผ๋งˆ๋‚˜ ์ž˜ ์‚ฌ์šฉํ•˜๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๋งŽ์€ ์ž์‹๋“ค์ด ํŠน์ • Props๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ๋‹ค์‹œ ๋ Œ๋”๋ง๋˜์–ด์•ผ ํ•˜๋ฏ€๋กœ, ์ด์ƒ์ ์œผ๋กœ๋Š” ์ด ๊ฐ’์€ ์ตœ์ดˆ ๋งˆ์šดํŠธ ์ดํ›„์—๋Š” ๋งŽ์ด ๊ฐ์†Œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • baseDuration: ์ตœ์ ํ™” ์—†์ด ์ „์ฒด <Profiler> ํ•˜์œ„ ํŠธ๋ฆฌ์— ๋Œ€ํ•ด ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์„ ์ถ”์ •ํ•˜๋Š” ์†Œ์š”๋œ ์‹œ๊ฐ„(๋ฐ€๋ฆฌ์ดˆ)์ž…๋‹ˆ๋‹ค. ํŠธ๋ฆฌ์— ์žˆ๋Š” ๊ฐ ์ปดํฌ๋„ŒํŠธ์˜ ๊ฐ€์žฅ ์ตœ๊ทผ ๋ Œ๋”๋ง ์‹œ๊ฐ„์„ ํ•ฉ์‚ฐํ•˜์—ฌ ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค. ์ด ๊ฐ’์€ ์ตœ์•…์˜ ๋ Œ๋”๋ง ๋น„์šฉ(์˜ˆ: ์ตœ์ดˆ ๋งˆ์šดํŠธ ๋˜๋Š” ๋ฉ”๋ชจ์ด์ œ์ด์…˜์ด ์—†๋Š” ํŠธ๋ฆฌ)์„ ์ถ”์ •ํ•ฉ๋‹ˆ๋‹ค. actualDuration๊ณผ ๋น„๊ตํ•˜์—ฌ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์ด ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • startTime: React๊ฐ€ ํ˜„์žฌ ์—…๋ฐ์ดํŠธ ๋ Œ๋”๋ง์„ ์‹œ์ž‘ํ•œ ์‹œ์ ์— ๋Œ€ํ•œ ์ˆซ์ž ํƒ€์ž„์Šคํƒฌํ”„์ž…๋‹ˆ๋‹ค.
  • commitTime: React๊ฐ€ ํ˜„์žฌ ์—…๋ฐ์ดํŠธ๋ฅผ ์ปค๋ฐ‹ํ•œ ์‹œ์ ์— ๋Œ€ํ•œ ์ˆซ์ž ํƒ€์ž„์Šคํƒฌํ”„์ž…๋‹ˆ๋‹ค. ์ด ๊ฐ’์€ ์ปค๋ฐ‹๋œ ๋ชจ๋“  ํ”„๋กœํŒŒ์ผ๋Ÿฌ ๊ฐ„์— ๊ณต์œ ๋˜๋ฏ€๋กœ ์›ํ•˜๋Š” ๊ฒฝ์šฐ ๊ทธ๋ฃนํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ๋ฒ•

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ๋ Œ๋”๋ง ์„ฑ๋Šฅ ์ธก์ •

React ํŠธ๋ฆฌ๋ฅผ <Profiler> ์ปดํฌ๋„ŒํŠธ๋กœ ๊ฐ์‹ธ์„œ ๋ Œ๋”๋ง ์„ฑ๋Šฅ์„ ์ธก์ •ํ•ฉ๋‹ˆ๋‹ค.

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

UI ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•œ id ๋ฌธ์ž์—ด๊ณผ ํŠธ๋ฆฌ ๋‚ด์˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์—…๋ฐ์ดํŠธ๋ฅผ ์ปค๋ฐ‹ํ•  ๋•Œ๋งˆ๋‹ค React๊ฐ€ ํ˜ธ์ถœํ•˜๋Š” onRender ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋‘ ๊ฐœ์˜ Props๊ฐ€ ์š”๊ตฌ๋ฉ๋‹ˆ๋‹ค.

์ฃผ์˜ํ•˜์„ธ์š”!

Profiling adds some additional overhead, so it is disabled in the production build by default. To opt into production profiling, you need to enable a special production build with profiling enabled.

์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค!

<Profiler>๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ์ธก์ •๊ฐ’๋“ค์„ ๋ชจ์•„์ค๋‹ˆ๋‹ค. ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋กœํŒŒ์ผ๋Ÿฌ๋ฅผ ์ฐพ๊ณ  ์žˆ๋‹ค๋ฉด, React ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์˜ ํ”„๋กœํŒŒ์ผ๋Ÿฌ ํƒญ์„ ์‚ฌ์šฉํ•ด ๋ณด์„ธ์š”. ๋ธŒ๋ผ์šฐ์ € ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ์จ ์œ ์‚ฌํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Components wrapped in <Profiler> will also be marked in the Component tracks of React Performance tracks even in profiling builds. In development builds, all components are marked in the Components track regardless of whether theyโ€™re wrapped in <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 ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•„์š”ํ•  ๋•Œ๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.