Performance Hints (KR)

## TL;DR

์„ฑ๋Šฅ ์ตœ์ ํ™”๋Š” โ€˜๋‚˜์ค‘์—โ€™ ํ•˜๋Š” ์ˆ™์ œ๊ฐ€ ์•„๋‹ˆ๋ผ, ์„ค๊ณ„ ๋‹จ๊ณ„์—์„œ๋ถ€ํ„ฐย ์ปดํ“จํ„ฐ ๋ฆฌ์†Œ์Šค์˜ ๋น„์šฉ์„ ๊ณ„์‚ฐํ•˜๊ณ  ๋‚ญ๋น„๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” ์„ ํƒ์„ ํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค. ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ํšจ์œจ์„ฑ, ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ์˜ ์กฐ๋ฐ€ํ•จ, ๊ทธ๋ฆฌ๊ณ  ๋ถˆํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ ์ค„์ด๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค.


## Overview

1. ์„ฑ๋Šฅ ์‚ฌ๊ณ ๋ฐฉ์‹์˜ ์ค‘์š”์„ฑ (The Importance of Thinking about Performance)

  • ์„ฑ๋Šฅ ์ค‘์‹ฌ ์„ค๊ณ„: โ€œ๋‚˜์ค‘์— ํ”„๋กœํŒŒ์ผ๋งํ•ด์„œ ๊ณ ์น˜์žโ€๋Š” ์ƒ๊ฐ์€ ๋ณ‘๋ชฉ ์ง€์ ์ด ๋„์ฒ˜์— ๊น”๋ ค ๊ณ ์น  ์ˆ˜์กฐ์ฐจ ์—†๋Š” โ€˜ํ‰ํ‰ํ•œ ํ”„๋กœํŒŒ์ผโ€™์„ ๋งŒ๋“œ๋ฏ€๋กœ, ์ฒ˜์Œ๋ถ€ํ„ฐ ํšจ์œจ์ ์ธ ๋Œ€์•ˆ์„ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

2. ์ถ”์ • (Estimation)

  • ์„ฑ๋Šฅ ์ง๊ด€ ๊ธฐ๋ฅด๊ธฐ: ์ž‘์„ฑ ์ค‘์ธ ์ฝ”๋“œ๊ฐ€ ํ…Œ์ŠคํŠธ์šฉ์ธ์ง€, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์šฉ์ธ์ง€, ํ˜น์€ ํ•ซ ํŒจ์Šค(Hot path)์ธ์ง€์— ๋”ฐ๋ผ ์–ด๋А ์ •๋„์˜ ๋ณต์žก์„ฑ์„ ๊ฐ์ˆ˜ํ• ์ง€ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

  • ์–ด๋ฆผ์ง์ž‘ ๊ณ„์‚ฐ (Back-of-the-envelope): L1 ์บ์‹œ(0.5ns)๋ถ€ํ„ฐ ๋””์Šคํฌ ํƒ์ƒ‰(5ms)๊นŒ์ง€์˜ ๋น„์šฉ์„ ๊ณ„์‚ฐํ•ด ์–ด๋–ค ์„ค๊ณ„๊ฐ€ ์œ ๋ฆฌํ• ์ง€ ๊ตฌํ˜„ ์ „์— ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค.

3. ์ธก์ • (Measurement)

  • ์ธก์ •์˜ ๊ฐ€์น˜: ์ต์ˆ™ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๋ฅผ ํ”„๋กœํŒŒ์ผ๋งํ•˜๋Š” ๊ฒƒ์€ ๊ตฌ์กฐ ํŒŒ์•…์—๋„ ๋„์›€์ด ๋˜๋ฉฐ, ๊ฐœ์„  ์ „ํ›„์˜ ์ด์ ์„ ์ •๋ฐ€ํ•˜๊ฒŒ ํ™•์ธํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

  • ํ”„๋กœํŒŒ์ผ๋ง ๋„๊ตฌ ๋ฐ ํŒ:ย pprof๋‚˜ย perf๋ฅผ ํ™œ์šฉํ•˜๊ณ , ์šด์˜ ํ™˜๊ฒฝ๊ณผ ์œ ์‚ฌํ•œ ์กฐ๊ฑด์—์„œ ๋งˆ์ดํฌ๋กœ๋ฒค์น˜๋งˆํฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.

  • ํ”„๋กœํŒŒ์ผ์ด ํ‰ํ‰ํ•  ๋•Œ (What to do when profiles are flat): ๋šœ๋ ทํ•œ ๋ณ‘๋ชฉ์ด ์—†๋‹ค๋ฉด ์ž‘์€ ๊ฐœ์„  20๊ฐœ๋ฅผ ๋ชจ์œผ๊ฑฐ๋‚˜, ๋ฃจํ”„ ๊ตฌ์กฐ ๋ณ€๊ฒฝ, ํ• ๋‹น ํšŸ์ˆ˜ ์ค„์ด๊ธฐ, ํ•˜๋“œ์›จ์–ด ์นด์šดํ„ฐ ๋ถ„์„ ๋“ฑ์„ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.

4. API ์„ค๊ณ„ ๊ณ ๋ ค์‚ฌํ•ญ (API Considerations)

  • ๋Œ€๋Ÿ‰ ์ฒ˜๋ฆฌ API (Bulk APIs): ํ•จ์ˆ˜ ํ˜ธ์ถœ ์˜ค๋ฒ„ํ—ค๋“œ์™€ ์ž ๊ธˆ ๋น„์šฉ์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ํ•ญ๋ชฉ์„ ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

  • ๋ทฐ ํƒ€์ž… (View types):ย string_view๋‚˜ย Spanย ๋“ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ๋ณต์‚ฌ ์—†์ด ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ๋งŒ ์ฐธ์กฐํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

  • ์‚ฌ์ „ ํ• ๋‹น/๊ณ„์‚ฐ๋œ ์ธ์ˆ˜: ํ˜ธ์ถœ์ž๊ฐ€ ์ด๋ฏธ ์•Œ๊ณ  ์žˆ๋Š” ์ •๋ณด๋ฅผ ๋ฃจํ‹ด์— ๋„˜๊ฒจ์ฃผ์–ด ๋‚ด๋ถ€์˜ ์ค‘๋ณต ๊ณ„์‚ฐ์ด๋‚˜ ํ• ๋‹น์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

  • ์Šค๋ ˆ๋“œ ํ˜ธํ™˜ vs ์Šค๋ ˆ๋“œ ์•ˆ์ „: ๋ฌด์กฐ๊ฑด ๋‚ด๋ถ€ ์ž ๊ธˆ์„ ๊ฑธ๊ธฐ๋ณด๋‹ค, ํ˜ธ์ถœ์ž๊ฐ€ ๋™๊ธฐํ™”๋ฅผ ์ฑ…์ž„์ง€๋Š” โ€˜์Šค๋ ˆ๋“œ ํ˜ธํ™˜โ€™ ํƒ€์ž…์„ ๊ธฐ๋ณธ์œผ๋กœ ํ•˜์—ฌ ์„ฑ๋Šฅ ์†์‹ค์„ ๋ง‰์Šต๋‹ˆ๋‹ค.

5. ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ฐœ์„  (Algorithmic Improvements)

  • ๊ทผ๋ณธ์  ์ตœ์ ํ™”: O(Nยฒ) ๋กœ์ง์„ O(N log N)์œผ๋กœ ๋ฐ”๊พธ๊ฑฐ๋‚˜, ์ตœ์‹  ๋…ผ๋ฌธ์— ๊ธฐ๋ฐ˜ํ•œ ๋” ๋น ๋ฅธ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ(์˜ˆ: Pearce-Kelly ์•Œ๊ณ ๋ฆฌ์ฆ˜)๋กœ ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค.

6. ๋” ๋‚˜์€ ๋ฉ”๋ชจ๋ฆฌ ํ‘œํ˜„ (Better Memory Representation)

  • ์กฐ๋ฐ€ํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ (Compact data structures): ์บ์‹œ ํšจ์œจ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ๋นฝ๋นฝํ•˜๊ฒŒ ์ฑ„์›Œ ๋„ฃ์Šต๋‹ˆ๋‹ค.

  • ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ (Memory layout): ํ•„๋“œ ์ˆœ์„œ๋ฅผ ์กฐ์ •ํ•ด ํŒจ๋”ฉ์„ ์ค„์ด๊ณ , ์ž์ฃผ ์“ฐ๋Š” ํ•„๋“œ๋ฅผ ๋ชจ์•„ ์บ์‹œ ๋ฏธ์Šค๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

  • ํฌ์ธํ„ฐ ๋Œ€์‹  ์ธ๋ฑ์Šค (Indices instead of pointers): 64๋น„ํŠธ ํฌ์ธํ„ฐ ๋Œ€์‹  ์ž‘์€ ์ •์ˆ˜ ์ธ๋ฑ์Šค๋ฅผ ์จ์„œ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰๊ณผ ๊ฐ„์ ‘ ์ฐธ์กฐ ๋น„์šฉ์„ ์ค„์ž…๋‹ˆ๋‹ค.

  • ๋ฐฐ์น˜ ์ €์žฅ (Batched storage): ์š”์†Œ๋งˆ๋‹ค ๊ฐœ๋ณ„ ํ• ๋‹นํ•˜์ง€ ์•Š๊ณ  ์ฒญํฌ(Chunk) ๋‹จ์œ„๋กœ ๋ฌถ์–ด ํ• ๋‹นํ•˜์—ฌ ๊ด€๋ฆฌ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ค„์ž…๋‹ˆ๋‹ค.

  • ์ธ๋ผ์ธ ์ €์žฅ (Inlined storage): ์š”์†Œ๊ฐ€ ์ ์„ ๋•Œ๋Š” ํž™ ํ• ๋‹น ์—†์ด ๊ฐ์ฒด ๋‚ด๋ถ€ ๊ณต๊ฐ„์„ ์ง์ ‘ ํ™œ์šฉ(InlinedVector ๋“ฑ)ํ•ฉ๋‹ˆ๋‹ค.

  • ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์ค‘์ฒฉ๋œ ๋งต: ๋งต ์•ˆ์— ๋งต์„ ๋‘๊ธฐ๋ณด๋‹ค ๋ณตํ•ฉ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋‹จ์ผ ๋งต์œผ๋กœ ๊ตฌ์„ฑํ•ด ์กฐํšŒ ํšŸ์ˆ˜๋ฅผ ์ค„์ž…๋‹ˆ๋‹ค.

  • ์•„๋ ˆ๋‚˜ (Arenas): ์ˆ˜๋ช…์ด ๋น„์Šทํ•œ ๊ฐ์ฒด๋“ค์„ ํฐ ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก์— ํ•œ๊บผ๋ฒˆ์— ํ• ๋‹นํ•˜๊ณ  ์†Œ๋ฉธ ๋น„์šฉ์„ ์ตœ์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค.

  • ๋งต ๋Œ€์‹  ๋ฐฐ์—ด: ํ‚ค ๋ฒ”์œ„๊ฐ€ ์ž‘๋‹ค๋ฉด ๋งต ๋Œ€์‹  ๋‹จ์ˆœ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์—ฌ O(1) ์„ฑ๋Šฅ์„ ํ™•๋ณดํ•ฉ๋‹ˆ๋‹ค.

  • ์…‹ ๋Œ€์‹  ๋น„ํŠธ ๋ฒกํ„ฐ: ์ •์ˆ˜ ์ง‘ํ•ฉ์€ ๋น„ํŠธ ๋ฒกํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ๊ทน๋‹จ์ ์œผ๋กœ ์•„๋ผ๊ณ  ์—ฐ์‚ฐ์„ ๊ฐ€์†ํ•ฉ๋‹ˆ๋‹ค.

7. ํ• ๋‹น ์ค„์ด๊ธฐ (Reduce Allocations)

  • ๋ถˆํ•„์š”ํ•œ ํ• ๋‹น ํ”ผํ•˜๊ธฐ: ๋นˆ ๊ฐ์ฒด ์ƒ์„ฑ ๋Œ€์‹  ์ •์ (Static) ๊ฐ์ฒด๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ํž™ ๋Œ€์‹  ์Šคํƒ์„ ์ ๊ทน ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • ์ปจํ…Œ์ด๋„ˆ ํฌ๊ธฐ ์กฐ์ • (Resize or reserve): ์˜ˆ์ƒ ํฌ๊ธฐ๋ฅผ ๋ฏธ๋ฆฌย reserve()ํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์ด๋™๊ณผ ๋ฉ”๋ชจ๋ฆฌ ์žฌํ• ๋‹น ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๋ง‰์Šต๋‹ˆ๋‹ค.

  • ๋ณต์‚ฌ ํ”ผํ•˜๊ธฐ: ์ด๋™ ์‹œ๋งจํ‹ฑ(Move)์„ ํ™œ์šฉํ•˜๊ณ , ํฐ ๊ฐ์ฒด ์ž์ฒด๋ฅผ ์˜ฎ๊ธฐ๊ธฐ๋ณด๋‹ค ํฌ์ธํ„ฐ๋‚˜ ์ธ๋ฑ์Šค ๋ฐฐ์—ด์„ ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค.

  • ์ž„์‹œ ๊ฐ์ฒด ์žฌ์‚ฌ์šฉ: ๋ฃจํ”„ ์•ˆ์—์„œ ๊ฐ์ฒด๋ฅผ ๋งค๋ฒˆ ์„ ์–ธํ•˜์ง€ ๋ง๊ณ  ๋ฃจํ”„ ๋ฐ–์—์„œ ์„ ์–ธํ•˜์—ฌ ๋‚ด๋ถ€ ๋ฒ„ํผ๋ฅผ ๊ณ„์† ์žฌ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

8. ๋ถˆํ•„์š”ํ•œ ์ž‘์—… ํ”ผํ•˜๊ธฐ (Avoid Unnecessary Work)

  • ๊ณตํ†ต ์ผ€์ด์Šค์˜ ๋น ๋ฅธ ๊ฒฝ๋กœ (Fast paths): ๋Œ€๋‹ค์ˆ˜๋ฅผ ์ฐจ์ง€ํ•˜๋Š” ๋‹จ์ˆœํ•œ ์ผ€์ด์Šค๋ฅผ ๋จผ์ € ์ฒดํฌํ•˜์—ฌ ๋ฌด๊ฑฐ์šด ๋กœ์ง์„ ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค.

  • ๊ฐ’๋น„์‹ผ ์ •๋ณด ์‚ฌ์ „ ๊ณ„์‚ฐ: ๋ฐ˜๋ณต์ ์œผ๋กœ ์“ฐ์ด๋Š” ๋น„์‹ผ ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๋Š” ๋ฏธ๋ฆฌ ๊ณ„์‚ฐํ•ด์„œ ์ €์žฅํ•ด ๋‘ก๋‹ˆ๋‹ค.

  • ๊ฐ’๋น„์‹ผ ๊ณ„์‚ฐ์„ ๋ฃจํ”„ ๋ฐ–์œผ๋กœ ์ด๋™: ๋ฃจํ”„๋ฅผ ๋Œ ๋•Œ๋งˆ๋‹ค ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๊ฐ’์€ ๋ฃจํ”„ ์‹œ์ž‘ ์ „์— ๋ฏธ๋ฆฌ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

  • ๊ฐ’๋น„์‹ผ ๊ณ„์‚ฐ ์ง€์—ฐ (Defer): ์ •๋ง๋กœ ๊ฒฐ๊ณผ๊ฐ€ ํ•„์š”ํ•œ ์‹œ์ ๊นŒ์ง€ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๊ณ  ์ตœ๋Œ€ํ•œ ๋ฏธ๋ฃน๋‹ˆ๋‹ค.

  • ์ฝ”๋“œ ํŠน์ˆ˜ํ™” (Specialize code): ๋ฒ”์šฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋Œ€์‹  ํŠน์ • ์ƒํ™ฉ์—๋งŒ ๋”ฑ ๋งž์ถ˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด ๋ฒ”์šฉ ๊ธฐ๋Šฅ์˜ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๋บ๋‹ˆ๋‹ค.

  • ์บ์‹ฑ ํ™œ์šฉ: ์ด์ „์— ์ˆ˜ํ–‰ํ•œ ์ž‘์—… ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•ด ๋‘๊ณ  ๋‹ค์‹œ ํ˜ธ์ถœ๋  ๋•Œ ์ฆ‰์‹œ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

9. ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์ž‘์—… ๋•๊ธฐ (Make the compilerโ€™s job easier)

  • ์ตœ์ ํ™” ํžŒํŠธ ์ œ๊ณต: ํ•ซ ํ•จ์ˆ˜ ๋‚ด ํ˜ธ์ถœ ์ œ๊ฑฐ, ๋กœ์ปฌ ๋ณ€์ˆ˜ ๋ณต์‚ฌ๋ฅผ ํ†ตํ•œ ์—์ผ๋ฆฌ์–ด์‹ฑ ๋ฐฉ์ง€, ์ˆ˜๋™ ๋ฃจํ”„ ์–ธ๋กค๋ง ๋“ฑ์„ ํ†ตํ•ด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋” ๋‚˜์€ ๊ธฐ๊ณ„์–ด๋ฅผ ๋ฝ‘๊ฒŒ ๋•์Šต๋‹ˆ๋‹ค.

10. ํ†ต๊ณ„ ์ˆ˜์ง‘ ๋น„์šฉ ์ ˆ๊ฐ (Reduce stats collection costs)

  • ํ†ต๊ณ„ ์ตœ์ ํ™”: ์“ฐ์ด์ง€ ์•Š๋Š” ํ†ต๊ณ„๋Š” ๊ณผ๊ฐํžˆ ์‚ญ์ œํ•˜๊ณ , ์ƒ˜ํ”Œ๋ง(Sampling)์„ ํ†ตํ•ด ์ผ๋ถ€ ์š”์ฒญ๋งŒ ๊ธฐ๋กํ•˜์—ฌ ๋ถ€ํ•˜๋ฅผ ๋‚ฎ์ถฅ๋‹ˆ๋‹ค.

11. ๋กœ๊น… ์ตœ์ ํ™” (Avoid logging on hot code paths)

  • ๋กœ๊น… ์ œ๊ฑฐ ๋ฐ ์ง€์—ฐ: ์ž์ฃผ ์‹คํ–‰๋˜๋Š” ๊ตฌ๊ฐ„์—์„œ๋Š” ๋กœ๊ทธ ํ™œ์„ฑํ™” ์—ฌ๋ถ€๋ฅผ ๋ฏธ๋ฆฌ ์ฒดํฌํ•˜๊ฑฐ๋‚˜ ์•„์˜ˆ ๋กœ๊น…์„ ๋นผ์„œ ์‹คํ–‰ ์†๋„๋ฅผ ์ง€ํ‚ต๋‹ˆ๋‹ค.

12. ์ฝ”๋“œ ํฌ๊ธฐ ๊ณ ๋ ค์‚ฌํ•ญ (Code Size Considerations)

  • ์ž์ฃผ ์ธ๋ผ์ธ๋˜๋Š” ์ฝ”๋“œ ๋‹ค๋“ฌ๊ธฐ: ๋„๋ฆฌ ์“ฐ์ด๋Š” ํ•จ์ˆ˜์˜ ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋“ฑ ํฐ ์ฝ”๋“œ๋Š” ์ธ๋ผ์ธ์—์„œ ์ œ์™ธํ•ด ๋ฐ”์ด๋„ˆ๋ฆฌ ๋น„๋Œ€ํ™”๋ฅผ ๋ง‰์Šต๋‹ˆ๋‹ค.

  • ์‹ ์ค‘ํ•œ ์ธ๋ผ์ธํ™”: ๋ฌด๋ถ„๋ณ„ํ•œ ์ธ๋ผ์ธ์€ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ํ‚ค์›Œ ๋ช…๋ น์–ด ์บ์‹œ ํšจ์œจ์„ ๋–จ์–ด๋œจ๋ฆฌ๋ฏ€๋กœ ์ ์ ˆํžˆ ์กฐ์ ˆํ•ฉ๋‹ˆ๋‹ค.

  • ํ…œํ”Œ๋ฆฟ ์ธ์Šคํ„ด์Šคํ™” ๊ฐ์†Œ: ๊ณตํ†ต ๋กœ์ง์„ ํ…œํ”Œ๋ฆฟ ๋ฐ–์œผ๋กœ ๋ถ„๋ฆฌํ•ด ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ณต์ œ๋˜๋Š” ๊ธฐ๊ณ„์–ด ์ฝ”๋“œ๋ฅผ ์ค„์ž…๋‹ˆ๋‹ค.

  • ์ปจํ…Œ์ด๋„ˆ ์ž‘์—… ๊ฐ์†Œ: ๋งต ์ดˆ๊ธฐํ™” ๋“ฑ์„ ํ•œ๊บผ๋ฒˆ์— ์ฒ˜๋ฆฌํ•˜๋Š” ๋Œ€๋Ÿ‰ ์ž‘์—…์„ ์จ์„œ ์ƒ์„ฑ๋˜๋Š” ์ฝ”๋“œ ์–‘์„ ์ค„์ž…๋‹ˆ๋‹ค.

13. ๋ณ‘๋ ฌํ™”์™€ ๋™๊ธฐํ™” (Parallelization and synchronization)

  • ๋ณ‘๋ ฌ์„ฑ ํ™œ์šฉ (Exploit parallelism): ๋ฉ€ํ‹ฐ ์ฝ”์–ด๋ฅผ ์“ฐ๊ธฐ ์œ„ํ•ด ์ž‘์—…์„ ๋‚˜๋ˆ„๋˜, ๋ฐฐ์น˜ ๋‹จ์œ„ ์ฒ˜๋ฆฌ๋ฅผ ํ†ตํ•ด ๊ด€๋ฆฌ ๋น„์šฉ์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

  • ์ž ๊ธˆ ํš๋“ ๋ถ„์‚ฐ (Amortize lock acquisition): ํ•œ ๋ฒˆ์˜ ์ž ๊ธˆ์œผ๋กœ ์—ฌ๋Ÿฌ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜์—ฌ ์ž ๊ธˆ ํš๋“ ํšŸ์ˆ˜ ์ž์ฒด๋ฅผ ์ค„์ž…๋‹ˆ๋‹ค.

  • ์ž„๊ณ„ ์˜์—ญ ๋‹จ์ถ• (Keep critical sections short): ์ž ๊ธˆ์„ ์ฅ” ์ƒํƒœ์—์„œ์˜ ์ž‘์—…์„ ์ตœ์†Œํ™”ํ•˜๊ณ  ๋น„์‹ผ ์—ฐ์‚ฐ์€ ์ž ๊ธˆ ๋ฐ–์—์„œ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  • ์ƒค๋”ฉ์„ ํ†ตํ•œ ๊ฒฝํ•ฉ ๊ฐ์†Œ: ํ•˜๋‚˜์˜ ์ž ๊ธˆ์„ ์—ฌ๋Ÿฌ ์ƒค๋“œ๋กœ ๋‚˜๋ˆ„์–ด ์Šค๋ ˆ๋“œ ๊ฐ„์˜ ์ถฉ๋Œ ๊ฐ€๋Šฅ์„ฑ์„ ๋‚ฎ์ถฅ๋‹ˆ๋‹ค.

  • SIMD ๋ช…๋ น์–ด: ํ•œ ๋ฒˆ์˜ ๋ช…๋ น์œผ๋กœ ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋™์‹œ ์ฒ˜๋ฆฌํ•˜๋Š” CPU ๊ธฐ๋Šฅ์„ ์ ๊ทน ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • ๊ฑฐ์ง“ ๊ณต์œ (False Sharing) ๊ฐ์†Œ: ์Šค๋ ˆ๋“œ๋ณ„ ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋กœ ๋‹ค๋ฅธ ์บ์‹œ ๋ผ์ธ์— ๋ฐฐ์น˜ํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ์บ์‹œ ๋™๊ธฐํ™”๋ฅผ ๋ง‰์Šต๋‹ˆ๋‹ค.

  • ๋ฌธ๋งฅ ๊ตํ™˜ ๋นˆ๋„ ๊ฐ์†Œ: ์•„์ฃผ ์ž‘์€ ์ž‘์—…์€ ์Šค๋ ˆ๋“œ ํ’€์— ๋„˜๊ธฐ์ง€ ๋ง๊ณ  ํ˜„์žฌ ์Šค๋ ˆ๋“œ์—์„œ ์ง์ ‘ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

  • ํŒŒ์ดํ”„๋ผ์ด๋‹์šฉ ๋ฒ„ํผ ์ฑ„๋„: ์ฑ„๋„์— ์ ์ ˆํ•œ ๋ฒ„ํผ๋ฅผ ๋‘์–ด ์†ก์ˆ˜์‹  ์Šค๋ ˆ๋“œ๊ฐ€ ์„œ๋กœ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์‹œ๊ฐ„์„ ์ค„์ž…๋‹ˆ๋‹ค.

  • ๋ฝํ”„๋ฆฌ(Lock-free) ์ ‘๊ทผ: ๋ฎคํ…์Šค ๋Œ€์‹  ์›์ž์  ์—ฐ์‚ฐ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋Œ€๊ธฐ ์—†๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

14. ํ”„๋กœํ† ์ฝœ ๋ฒ„ํผ ์กฐ์–ธ (Protocol Buffer advice)

  • ์ง๋ ฌํ™” ๋น„์šฉ ์ตœ์†Œํ™”: ๋ถˆํ•„์š”ํ•œ ์ค‘์ฒฉ ํšŒํ”ผ, 1~15๋ฒˆ ํ•„๋“œ ๋ฒˆํ˜ธ ์šฐ์„  ์‚ฌ์šฉ, ์ ์ ˆํ•œ ์ˆซ์ž ํƒ€์ž… ์„ ํƒ,ย VIEW/CORDย ์‚ฌ์šฉ, ์•„๋ ˆ๋‚˜ ํ™œ์šฉ ๋“ฑ์œผ๋กœ ํ”„๋กœํ† ๋ฒ„ํ”„ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ค„์ž…๋‹ˆ๋‹ค.

15. C++ ์ „์šฉ ์กฐ์–ธ (C++-Specific advice)

  • ์ตœ์ ํ™”๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ™œ์šฉ:ย flat_hash_map,ย InlinedVector,ย Status/StatusOrย ์ตœ์ ํ™” ๋“ฑ C++ ์–ธ์–ด์™€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŠน์„ฑ์— ๋งž๋Š” ๊ธฐ๋ฒ•์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

## Takeaways

  • ํ•˜๋“œ์›จ์–ด๋Š” ๊ฑฐ์ง“๋งํ•˜์ง€ ์•Š๋Š”๋‹ค: ์บ์‹œ ๊ณ„์ธต ๊ตฌ์กฐ์™€ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ๋น„์šฉ์„ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์„ฑ๋Šฅ ํŠœ๋‹์˜ ์‹œ์ž‘์ž…๋‹ˆ๋‹ค.

  • ๋””์ž์ธ์ด ์„ฑ๋Šฅ์ด๋‹ค: ํšจ์œจ์ ์ธ API์™€ ๋ฐ์ดํ„ฐ ๋ ˆ์ด์•„์›ƒ ์„ค๊ณ„๋Š” ๋‚˜์ค‘์— ์ฝ”๋“œ๋ฅผ ์ตœ์ ํ™”ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๊ฐ•๋ ฅํ•ฉ๋‹ˆ๋‹ค.

  • ์ž‘์€ ์ฐจ์ด๊ฐ€ ๋ชจ์—ฌ ํฐ ์ฐจ์ด๋ฅผ ๋งŒ๋“ ๋‹ค: 1%์˜ ๊ฐœ์„ ์„ ๋ฌด์‹œํ•˜์ง€ ๋งˆ์„ธ์š”. ๊ทธ๋Ÿฐ ๊ฐœ์„ ๋“ค์ด ์Œ“์—ฌ ๋Œ€๊ทœ๋ชจ ์‹œ์Šคํ…œ์˜ ์•ˆ์ •์„ฑ์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

  • ๊ฐ€์„ค์€ ์ธก์ •์œผ๋กœ ์ฆ๋ช…ํ•˜๋ผ: ์ง๊ด€์—๋งŒ ์˜์กดํ•˜์ง€ ๋ง๊ณ  ํ”„๋กœํŒŒ์ผ๋Ÿฌ๋ฅผ ํ†ตํ•ด ์‹ค์ œ ์–ด๋””์„œ ๋ฆฌ์†Œ์Šค๊ฐ€ ์ƒˆ๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.

Reference

Jeffrey Dean & Sanjay Ghemawat, Performance Hints, 2025

Further reading