3 minute read

ํ•™๋ถ€ ์กธ์—…์„ ์œ„ํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋žฉ ์—ฐ๊ตฌ์‹ค์— ์ปจํƒํ•˜์—ฌ ์กธ์—… ๊ณผ์ œ/์—ฐ๊ตฌ๋ฅผ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰ ํ•™๊ธฐ์— ๋“ฃ๋Š” ์œ ์ผํ•œ ์ปด๊ณต๊ณผ ์ˆ˜์—…์ด๊ณ , C++ ์ฝ”๋“œ๋ฅผ ์—„์ฒญ๋‚˜๊ฒŒ ๋งŽ์ด ๋ณผ ์ˆ˜ ์žˆ์–ด์„œ ์žฌ๋ฏธ๋„ ์žˆ์Šต๋‹ˆ๋‹ค ใ…Žใ…Ž ๋ฌด์‚ฌํžˆ ์กธ์—…ํ•  ์ˆ˜ ์žˆ๊ธธ!! ์•„์ขŒ์žฃ!

Compile Optimization

C++ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผํ•  ๋•Œ, ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์‹คํ–‰ ์†๋„, ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰, ๋ฐ”์ด๋„ˆ๋ฆฌ ํฌ๊ธฐ ๋“ฑ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ์ž๋™ ๋˜๋Š” ์ˆ˜๋™์œผ๋กœ ์ ์šฉํ•˜๋Š” ์ตœ์ ํ™” ๊ธฐ๋ฒ•๋“ค์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

๋ณดํ†ต ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ปดํŒŒ์ผ๋Ÿฌ ์˜ต์…˜์„ ํ†ตํ•ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค: โ€ข -O0: ์ตœ์ ํ™” ์—†์Œ (๋””๋ฒ„๊น…์— ์šฉ์ด) โ€ข -O1, -O2, -O3: ์ ์  ๋” ๊ณต๊ฒฉ์ ์ธ ์ตœ์ ํ™” โ€ข -Os: ์ฝ”๋“œ ํฌ๊ธฐ ์ตœ์ ํ™” โ€ข -Ofast: ํ‘œ์ค€์„ ๋ฌด์‹œํ•˜๊ณ  ์„ฑ๋Šฅ์— ์ง‘์ค‘ โ€ข -flto: Link-Time Optimization

โธป

๐Ÿ› ๏ธ ์–ด๋–ค ๊ฒƒ๋“ค์„ ํ–ˆ์„ ๋•Œ โ€œ์ตœ์ ํ™”๋ฅผ ํ–ˆ๋‹คโ€๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‚˜?

  1. ์ปดํŒŒ์ผ๋Ÿฌ ์ตœ์ ํ™” ํ”Œ๋ž˜๊ทธ ์กฐ์ • โ€ข -O2์—์„œ -O3, ํ˜น์€ -Ofast๋กœ ๋ณ€๊ฒฝ โ€ข -flto (Link Time Optimization) ํ™œ์„ฑํ™” โ€ข -march=native, -mtune=native ์‚ฌ์šฉ์œผ๋กœ ๋Œ€์ƒ CPU์— ๋งž์ถ˜ ์ฝ”๋“œ ์ƒ์„ฑ

โžก๏ธ ์ฝ”๋“œ ๋ณ€๊ฒฝ ์—†์ด ์„ฑ๋Šฅ ํ–ฅ์ƒ ๊ฐ€๋Šฅ

โธป

  1. ์ฝ”๋“œ ์ˆ˜์ค€์˜ ๋ฆฌํŒฉํ† ๋ง (์ปดํŒŒ์ผ๋Ÿฌ ์นœํ™”์  ์ฝ”๋“œ ์ž‘์„ฑ)

๋ถˆํ•„์š”ํ•œ ๋ณต์‚ฌ ์ œ๊ฑฐ โ€ข std::move, std::forward ์ ๊ทน ์‚ฌ์šฉ โ€ข RVO(Return Value Optimization) ๊ณ ๋ ค

์ธ๋ผ์ธ ๊ฐ€๋Šฅ์„ฑ ํ–ฅ์ƒ โ€ข ์งง๊ณ  ์ž์ฃผ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜๋Š” inline ๋˜๋Š” ํ…œํ”Œ๋ฆฟ์œผ๋กœ ์ž‘์„ฑ

๋ฃจํ”„ ์ตœ์ ํ™” โ€ข ๋ฃจํ”„ ๋ถˆ๋ณ€ ์กฐ๊ฑด ์ œ๊ฑฐ โ€ข ๋ฃจํ”„ ์–ธ๋กค๋ง ๊ฐ€๋Šฅํ•˜๋„๋ก ๊ตฌ์กฐ ์กฐ์ •

โžก๏ธ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋” ์ž˜ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ฝ”๋“œ ๊ตฌ์กฐ๋ฅผ ์ •๋ฆฌ

โธป

  1. ํ…œํ”Œ๋ฆฟ๊ณผ constexpr์˜ ํ™œ์šฉ โ€ข constexpr ํ•จ์ˆ˜๋กœ ์ปดํŒŒ์ผ ํƒ€์ž„ ๊ณ„์‚ฐ ์œ ๋„ โ€ข ํ…œํ”Œ๋ฆฟ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ†ตํ•ด ๋Ÿฐํƒ€์ž„ ๊ณ„์‚ฐ ์ œ๊ฑฐ

โžก๏ธ ์‹คํ–‰ ์‹œ์ ์˜ ๋ถ€๋‹ด์„ ์ค„์ด๊ณ  ์ปดํŒŒ์ผ ํƒ€์ž„์œผ๋กœ ์ด์ „

โธป

  1. ๋ง์ปค ์ตœ์ ํ™” โ€ข LTO ์ ์šฉ (-flto) โ€ข ์ •์  ๋งํฌ vs ๋™์  ๋งํฌ ์ „๋žต ์กฐ์ •

โžก๏ธ ์ตœ์ข… ๋ฐ”์ด๋„ˆ๋ฆฌ ํฌ๊ธฐ ๊ฐ์†Œ ๋˜๋Š” ์†๋„ ํ–ฅ์ƒ

โธป

๐Ÿ“ˆ ์–ด๋–ค ์ธก๋ฉด์—์„œ ๊ฐœ์„ ๋˜๋ฉด โ€œ์„ฑ๊ณต์ ์ธ ์ตœ์ ํ™”โ€๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์„๊นŒ? 1. ์‹คํ–‰ ์‹œ๊ฐ„ ๋‹จ์ถ• โ€ข ํŠน์ • ์—ฐ์‚ฐ์ด๋‚˜ ์ „์ฒด ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰ ์‹œ๊ฐ„์ด ๊ฐ์†Œ 2. ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ์ ˆ๊ฐ โ€ข ํ• ๋‹น ํฌ๊ธฐ ์ค„์ด๊ธฐ, ์ค‘๋ณต ์ œ๊ฑฐ, ์บ์‹œ ์‚ฌ์šฉ ์ตœ์ ํ™” 3. ๋ฐ”์ด๋„ˆ๋ฆฌ ํฌ๊ธฐ ๊ฐ์†Œ โ€ข ํŠนํžˆ ์ž„๋ฒ ๋””๋“œ ํ™˜๊ฒฝ์ด๋‚˜ ๋ชจ๋ฐ”์ผ ํ™˜๊ฒฝ์—์„œ ์ค‘์š” 4. ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ๋‹จ์ถ• โ€ข ํ…œํ”Œ๋ฆฟ ์ธ์Šคํ„ด์Šค ์ˆ˜ ์ค„์ด๊ธฐ, ํ—ค๋” ํฌํ•จ ์ตœ์†Œํ™” ๋“ฑ 5. ๋””๋ฒ„๊น… ์šฉ์ด์„ฑ ์œ ์ง€ โ€ข ์ตœ์ ํ™” ์ˆ˜์ค€์„ ์กฐ์ •ํ•˜๋ฉด์„œ๋„ ๋””๋ฒ„๊น… ๊ฐ€๋Šฅ์„ฑ ํ™•๋ณด

โธป

๐Ÿ“Œ ์ •๋ฆฌ

โ€œC++ ์ปดํŒŒ์ผ ์ตœ์ ํ™”๋ฅผ ํ–ˆ๋‹คโ€๋Š” ๋ง์€ ๋ณดํ†ต ์ปดํŒŒ์ผ๋Ÿฌ ํ”Œ๋ž˜๊ทธ ์กฐ์ •, ์ฝ”๋“œ ๊ตฌ์กฐ ๋ฆฌํŒฉํ† ๋ง, ์ปดํŒŒ์ผ ํƒ€์ž„ ๊ณ„์‚ฐ ์œ ๋„, ๋ง์ปค ์ตœ์ ํ™” ๋“ฑ์„ ํ†ตํ•ด ์„ฑ๋Šฅ, ํฌ๊ธฐ, ์ž์› ํšจ์œจ์„ฑ์„ ๊ฐœ์„ ํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

โธป

ํ•„์š”ํ•˜๋‹ค๋ฉด, ์‹ค์ œ ์ ์šฉ๋œ ์˜ˆ์‹œ๋‚˜ ํŠน์ • ์ƒํ™ฉ์— ๋งž๋Š” ์ตœ์ ํ™” ์ „๋žต๋„ ๋„์™€๋“œ๋ฆด ์ˆ˜ ์žˆ์–ด์š”. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฒŒ์ž„ ํด๋ผ์ด์–ธํŠธ ์ตœ์ ํ™” vs ์„œ๋ฒ„ ๋ฐฑ์—”๋“œ ์ตœ์ ํ™”๋Š” ์ ‘๊ทผ์ด ์ข€ ๋‹ค๋ฅด๊ฑฐ๋“ ์š”. ์–ด๋–ค ๋งฅ๋ฝ์ธ์ง€ ์•Œ๋ ค์ฃผ์‹œ๋ฉด ๋” ๊ตฌ์ฒด์ ์œผ๋กœ ์ด์•ผ๊ธฐํ•ด๋“œ๋ฆด๊ฒŒ์š”!