Profiler API
Profiler
๋ React ์ ํ๋ฆฌ์ผ์ด์
์ด ๋ ๋๋งํ๋ ๋น๋์ ๋ ๋๋ง โ๋น์ฉโ์ ์ธก์ ํฉ๋๋ค.
Profiler์ ๋ชฉ์ ์ ๋ฉ๋ชจ์ด์ ์ด์
๊ฐ์ ์ฑ๋ฅ ์ต์ ํ ๋ฐฉ๋ฒ์ ํ์ฉํ ์ ์๋ ์ ํ๋ฆฌ์ผ์ด์
์ ๋๋ฆฐ ๋ถ๋ถ๋ค์ ์๋ณํด๋ด๋ ๊ฒ์
๋๋ค.
์ฃผ์
ํ๋กํ์ผ๋ง์ ์ฝ๊ฐ์ ์ค๋ฒํค๋๋ฅผ ๋ง๋ค๊ธฐ ๋๋ฌธ์ ํ๋ก๋์ ๋น๋์์๋ ๋นํ์ฑํ๋์ด ์์ต๋๋ค..
ํ๋ก๋์ ์์ ํ๋กํ์ผ๋ง์ ํ์ฑํํ๊ธธ ์ํ์ ๋ค๋ฉด React์์ ์ ๊ณตํ๋ ํน๋ณ ํ๋ก๋์ ๋น๋๋ฅผ ํตํด์ ํ์ฑํํ์ค ์ ์์ต๋๋ค. ๋ค์ ๋งํฌ์์ ์ด ํน๋ณ ๋น๋์ ๋ํด์ ๋ ์ฝ์ด๋ณด์ค ์ ์์ต๋๋ค fb.me/react-profiling
์ฌ์ฉ๋ฒ
Profiler
๋ React ํธ๋ฆฌ ๋ด์ ์ด๋์๋ ์ถ๊ฐ๋ ์ ์์ผ๋ฉฐ ํธ๋ฆฌ์ ํน์ ๋ถ๋ถ์ ๋ ๋๋ง ๋น์ฉ์ ๊ณ์ฐํด์ค๋๋ค.
์ด๋ ๋ ๊ฐ์ง props๋ฅผ ์๊ตฌํฉ๋๋ค: id
(๋ฌธ์์ด) ์ onRender
์ฝ๋ฐฑ (ํจ์)์ด๋ฉฐ React ํธ๋ฆฌ ๋ด ์ปดํฌ๋ํธ์ ์
๋ฐ์ดํธ๊ฐ โ์ปค๋ฐโ๋๋ฉด ํธ์ถ๋ฉ๋๋ค.
์๋ฅผ ๋ค์ด, Navigation
์ปดํฌ๋ํธ์ ์์ ์ปดํฌ๋ํธ๋ค์ ํ๋กํ์ผํ๊ธฐ ์ํด์๋
render(
<App>
<Profiler id="Navigation" onRender={callback}> <Navigation {...props} />
</Profiler>
<Main {...props} />
</App>
);
๋ณต์์ Profiler
์ปดํฌ๋ํธ๋ก ์ ํ๋ฆฌ์ผ์ด์
์ ๋ค๋ฅธ ๋ถ๋ถ๋ค์ ๊ณ์ฐํ ์ ์์ต๋๋ค
render(
<App>
<Profiler id="Navigation" onRender={callback}> <Navigation {...props} />
</Profiler>
<Profiler id="Main" onRender={callback}> <Main {...props} />
</Profiler>
</App>
);
Profiler
์ปดํฌ๋ํธ๋ ํ์ ํธ๋ฆฌ์ ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ค์ ๊ณ์ฐํ๊ธฐ ์ํด ์ค์ฒฉํด์ ์ฌ์ฉํ ์ ์์ต๋๋ค
render(
<App>
<Profiler id="Panel" onRender={callback}> <Panel {...props}>
<Profiler id="Content" onRender={callback}> <Content {...props} />
</Profiler>
<Profiler id="PreviewPane" onRender={callback}> <PreviewPane {...props} />
</Profiler>
</Panel>
</Profiler>
</App>
);
์ฃผ์์ฌํญ
Profiler
๋ ๊ฐ๋ฒผ์ด ์ปดํฌ๋ํธ์ด์ง๋ง ํ์ํ ๋๋ง ์ฌ์ฉํด์ผ ํฉ๋๋ค. ๊ฐ Profiler๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์กฐ๊ธ์ CPU์ ๋ฉ๋ชจ๋ฆฌ ๋น์ฉ์ ์ถ๊ฐํ๊ฒ ๋ฉ๋๋ค.
onRender
์ฝ๋ฐฑ
Profiler
๋ onRender
ํจ์๋ฅผ prop์ผ๋ก ์๊ตฌํฉ๋๋ค.
React๋ ํ๋กํ์ผ ํธ๋ฆฌ ๋ด์ ์ปดํฌ๋ํธ์ ์
๋ฐ์ดํธ๊ฐ โ์ปค๋ฐโ๋ ๋๋ง๋ค ์ด ํจ์๋ฅผ ํธ์ถํฉ๋๋ค.
์ด ํจ์๋ ๋ฌด์์ด ๋ ๋๋ง ๋์๋์ง ๊ทธ๋ฆฌ๊ณ ์ผ๋ง๋ ๊ฑธ๋ ธ๋์ง ์ค๋ช
ํ๋ ์
๋ ฅ๊ฐ์ ๋ฐ๊ฒ ๋ฉ๋๋ค.
function onRenderCallback(
id, // ๋ฐฉ๊ธ ์ปค๋ฐ๋ Profiler ํธ๋ฆฌ์ "id"
phase, // "mount" (ํธ๋ฆฌ๊ฐ ๋ฐฉ๊ธ ๋ง์ดํธ๊ฐ ๋ ๊ฒฝ์ฐ) ํน์ "update"(ํธ๋ฆฌ๊ฐ ๋ฆฌ๋ ๋๋ง๋ ๊ฒฝ์ฐ)
actualDuration, // ์ปค๋ฐ๋ ์
๋ฐ์ดํธ๋ฅผ ๋ ๋๋งํ๋๋ฐ ๊ฑธ๋ฆฐ ์๊ฐ
baseDuration, // ๋ฉ๋ชจ์ด์ ์ด์
์์ด ํ์ ํธ๋ฆฌ ์ ์ฒด๋ฅผ ๋ ๋๋งํ๋๋ฐ ๊ฑธ๋ฆฌ๋ ์์์๊ฐ
startTime, // React๊ฐ ์ธ์ ํด๋น ์
๋ฐ์ดํธ๋ฅผ ๋ ๋๋งํ๊ธฐ ์์ํ๋์ง
commitTime, // React๊ฐ ํด๋น ์
๋ฐ์ดํธ๋ฅผ ์ธ์ ์ปค๋ฐํ๋์ง
interactions // ์ด ์
๋ฐ์ดํธ์ ํด๋นํ๋ ์ํธ์์ฉ๋ค์ ์งํฉ
) {
// ๋ ๋๋ง ํ์ด๋ฐ์ ์งํฉํ๊ฑฐ๋ ๋ก๊ทธ...
}
๊ฐ prop์ ๋ํด ์ข ๋ ์์ธํ ์์๋ณด๊ฒ ์ต๋๋ค
id: string
- ๋ฐฉ๊ธ ์ปค๋ฐ๋Profiler
ํธ๋ฆฌ์id
prop. ๋ณต์์ ํ๋กํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค๋ฉด ํธ๋ฆฌ์ ์ด๋ ๋ถ๋ถ์ด ์ปค๋ฐ๋์๋์ง ์๋ณํ๋๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค.phase: "mount" | "update"
- ํด๋น ํธ๋ฆฌ๊ฐ ๋ฐฉ๊ธ ๋ง์ดํธ๋ ๊ฑด์ง prop, state ํน์ hooks์ ๋ณํ๋ก ์ธํ์ฌ ๋ฆฌ๋ ๋๋ง ๋ ๊ฑด์ง ์๋ณํฉ๋๋ค.actualDuration: number
- ํ์ฌ ์ ๋ฐ์ดํธ์ ํด๋นํ๋Profiler
์ ์์ ์ปดํฌ๋ํธ๋ค์ ๋ ๋ํ๋๋ฐ ๊ฑธ๋ฆฐ ์๊ฐ ์ด๊ฒ์ ํ์ ํธ๋ฆฌ๊ฐ ์ผ๋ง๋ ๋ฉ๋ชจ์ด์ ์ด์ ์ ์ ํ์ฉํ๊ณ ์๋์ง๋ฅผ ์์ํฉ๋๋ค (e.g.React.memo
,useMemo
,shouldComponentUpdate
). ์ด์์ ์ผ๋ก ๋๋ค์์ ์์ ์ปดํฌ๋ํธ๋ค์ ํน์ prop์ด ๋ณํ ๊ฒฝ์ฐ์๋ง ๋ฆฌ๋ ๋๋ง์ด ํ์ํ๊ธฐ ๋๋ฌธ์ ์ด ๊ฐ์ ์ด๊ธฐ ๋ ๋๋ง ์ดํ์ ์๋น ๋ถ๋ถ ๊ฐ์ํด์ผ ํฉ๋๋ค.baseDuration: number
-Profiler
ํธ๋ฆฌ ๋ด ๊ฐ๋ณ ์ปดํฌ๋ํธ๋ค์ ๊ฐ์ฅ ์ต๊ทผrender
์๊ฐ์ ์ง์๊ธฐ๊ฐ ์ด ๊ฐ์ ๋ ๋๋ง ๋น์ฉ์ ์ต์ ์ผ์ด์ค๋ฅผ ๊ณ์ฐํด์ค๋๋ค(e.g. ์ด๊ธฐ ๋ง์ดํธ ํน์ ๋ฉ๋ชจ์ด์ ์ด์ ์ด ์๋ ํธ๋ฆฌ)startTime: number
- React๊ฐ ํ์ฌ ์ ๋ฐ์ดํธ์ ๋ํด ๋ ๋๋ง์ ์์ํ ์๊ฐ์ ํ์ ์คํฌํ.commitTime: number
- React๊ฐ ํ์ฌ ์ ๋ฐ์ดํธ๋ฅผ ์ปค๋ฐํ ์๊ฐ์ ํ์ ์คํฌํ ์ด ๊ฐ์ ๋ชจ๋ ํ๋กํ์ผ๋ฌ๋ค์ด ๊ณต์ ํ๊ธฐ ๋๋ฌธ์ ์ํ๋ค๋ฉด ๊ทธ๋ฃน์ ์ง์ ์ ์์ต๋๋ค.interactions: Set
- ์ ๋ฐ์ดํธ๊ฐ ๊ณํ๋์์ ๋ ์ถ์ ํ๊ณ ์๋ โ์ํธ์์ฉโ์ ์งํฉ (e.g.render
ํน์setState
๊ฐ ํธ์ถ๋์์ ๋).
์ฃผ์
์ํธ์์ฉ์ ์ถ์ ํ๋ API๋ ์์ง ์ํ๋จ๊ณ์ ์์ง๋ง, ์ํธ์์ฉ์ ์ ๋ฐ์ดํธ์ ์์ธ์ ์๋ณํ๋๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค
๋ค์์ ๋งํฌ์์ ๋ ์์ธํ ์์๋ณผ ์ ์์ต๋๋ค fb.me/react-interaction-tracing