React rendering performance test - TEAM-ARK/inflearn-clone-front GitHub Wiki

์ด๋ฒˆ์— styled components๋ฅผ ์‚ฌ์šฉ ์‹œ re-rendering ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ react์—์„œ re-rendering ๋˜๋Š” ๊ฒƒ๊ณผ ์‹ค์ œ ๋ธŒ๋ผ์šฐ์ €์—์„œ re-rendering ๋˜๋Š” ๊ฒƒ์„ ๋‹ฌ๋ž๋‹ค. virtual dom์ด ์‹ค์ œ๋กœ ๋ณ€๊ฒฝ๋œ ์˜์—ญ๋งŒ re-rendering์„ ํ•˜๋„๋ก ํ•œ๋‹ค. ๊ทธ๋ž˜๋„ react์—์„œ re-rendering ์˜์—ญ์œผ๋กœ ์žกํžˆ๋Š” ๊ฒƒ์€ ๊ทธ ํ•จ์ˆ˜๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ํ•˜๋ฉด์„œ ์‹คํ–‰๋˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ์–‘์ด ๋งŽ์•„์ง€๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค. ์ด๊ฒƒ์ด ์‹ค์ œ๋กœ ์„ฑ๋Šฅ์— ์–ผ๋งˆ๋‚˜ ์ฐจ์ด๊ฐ€ ์žˆ๋Š”์ง€ ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด๋ณด๋ ค ํ•œ๋‹ค.

์ด๋ฒˆ์— ๋ Œ๋”๋ง ๊ด€๋ จํ•ด์„œ ๊ฐœ์„ ํ•œ ์ฝ”๋“œ๋ฅผ ์ ์šฉํ•˜๊ธฐ ์ „๊ณผ ์ ์šฉ ํ›„์˜ ์„ฑ๋Šฅ์„ ์ธก์ •ํ•ด๋ณด์•˜๋‹ค.

๊ฐœ์„  ์ „ ์ฝ”๋“œ๋กœ ํ…Œ์ŠคํŠธ

ํฌ๋กฌ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ React Profiler

ํฌ๋กฌ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ Performance

๊ฐœ์„  ํ›„ ์ฝ”๋“œ๋กœ ํ…Œ์ŠคํŠธ

ํฌ๋กฌ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ React Profiler

ํฌ๋กฌ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ Performance

๋น„๊ต ๋ฐ ๋ถ„์„

  • ์ง€๋‚œ๋ฒˆ ๋ Œ๋”๋ง ๊ด€๋ จ ๊ธ€์—์„œ ์•Œ์•„๋ดค์ง€๋งŒ ์‹ค์ œ๋กœ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ Œ๋”๋ง ๋˜๋Š” ๋ถ€๋ถ„์—์„œ ์ฐจ์ด๋Š” ์—†์—ˆ๋‹ค.

์‹ค์ œ ๋ Œ๋”๋ง ํ‘œ์‹œ

๊ฐœ์„  ์ „ ์ฝ”๋“œ๋กœ ์‹ค์ œ ๋ Œ๋”๋ง

๊ฐœ์„  ํ›„ ์ฝ”๋“œ๋กœ ์‹ค์ œ ๋ Œ๋”๋ง

๊ทธ๋Ÿฌ๋‚˜ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด๋ณด๋ฉด ์œ ์˜๋ฏธํ•œ ์ฐจ์ด๊ฐ€ ๋‚ฌ๋‹ค. ๋ฆฌ์•กํŠธ ํ”„๋กœํŒŒ์ผ๋Ÿฌ๋กœ ์ธก์ •ํ•œ ๊ฒฝ์šฐ์—” 10๋ฐฐ์ •๋„ ์ฐจ์ด๊ฐ€ ๋‚ฌ๊ณ  ๋ธŒ๋ผ์šฐ์ €์—์„œ ์„ฑ๋Šฅํ…Œ์ŠคํŠธ๋ฅผ ํ•œ ๊ฒฝ์šฐ 3~4๋ฐฐ ์ฐจ์ด๊ฐ€ ๋‚ฌ๋‹ค.

์‚ฌ๋žŒ์ด ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ๋Š๋ผ๋Š” ํ”„๋ ˆ์ž„์ด 60Hz, 16.7ms์ธ์ ์„ ๊ฐ์•ˆํ•˜๋ฉด ๊ฐœ์„  ์ „ ์ฝ”๋“œ์˜ ๋ Œ๋”๋ง ์‹œ๊ฐ„์€ ์•ฝ 47ms, ์•ฝ 21Hz๋กœ ๋งค์šฐ ๋Š๋ฆฐ๋ฐ˜๋ฉด

๊ฐœ์„  ํ›„ ์ฝ”๋“œ์˜ ๋ Œ๋”๋ง ์‹œ๊ฐ„์€ ์•ฝ 11.3ms, ์•ฝ 88Hz๋กœ ์ƒ๋‹นํžˆ ๋ถ€๋“œ๋Ÿฌ์šด ํŽธ์ด์—ˆ๋‹ค.

๊ฐœ์„  ์ „ ์ฝ”๋“œ์— useMemo ์‚ฌ์šฉ

          useMemo(() => {
            return lectureData.courseInfo?.category?.map((item) => (
              <CourseCommonButton
                key={item.id}
                id={item.id}
                text={item.name}
                selectedId={selectedCategoryId}
                setSelectedId={setSelectedCategoryId}
              />
            ));
          }, [lectureData.courseInfo?.category, selectedCategoryId])
  • useMemo๋ฅผ ์ ์šฉํ•œ ๋ถ€๋ถ„์€ re-rendering์ด ๋˜์ง€ ์•Š์•˜๊ณ  ๋ Œ๋”๋ง ์‹œ๊ฐ„๋„ ์ค„์–ด๋“ค์—ˆ๋‹ค.
    • ๋ฆฌ์•กํŠธ ํ”„๋กœํŒŒ์ผ๋Ÿฌ : 10ms -> 6~8ms๋กœ ์•ฝ๊ฐ„ ์ค„์–ด๋“  ๋ชจ์Šต์„ ๋ณด์˜€๋‹ค.
    • ํฌ๋กฌ ํผํฌ๋จผ์Šค : 48ms -> 31.4ms
  • ํ—ค๋” ์ชฝ ๊นŒ์ง€ useMemo๋ฅผ ์‚ฌ์šฉํ•˜์ง„ ์•Š์•˜์œผ๋‹ˆ ๋ชจ๋“  styled-components๊ฐ€ ์ ์šฉ๋œ ๋ถ€๋ถ„์— useMemo๋ฅผ ์ ์šฉํ•œ๋‹ค๋ฉด ๋” ์ค„์–ด๋“ค ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค.

๊ฒฐ๋ก 

๋ Œ๋”๋ง์ด ๋Š๋ฆฐ ๊ฒƒ์ด ์ฒด๊ฐ์ด ๋˜์–ด ์ตœ์ ํ™”๋ฅผ ํ•ด์•ผ๋œ๋‹ค๋ฉด styled components๋ฅผ ์‚ฌ์šฉํ•œ ๊ณณ์—” ์ „๋ถ€ useMemo๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ปดํฌ๋„ŒํŠธ ๋ถ„๋ฆฌ ์‹œ ์ตœ๋Œ€ํ•œ useState๋ฅผ ์‚ฌ์šฉ์„ ์ž์ œํ•˜๊ณ  useRef๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

๊ด€๋ จ ๊ธ€ ๋งํฌ