[Go] map์˜ ๊ตฌ์กฐ

๋‚ด ๊ฒฝํ—˜์ƒ, Go๋กœ ์ง  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‹ฌ๊ฐํ•œ ์„ฑ๋Šฅ ๋ถ€ํ•˜๋‚˜ ๋ฒ„๊ทธ๋ฅผ ์œ ๋ฐœํ•˜๋Š” ๊ฒƒ์€ ๋Œ€๋ถ€๋ถ„ map์˜ ์ž˜๋ชป๋œ ์‚ฌ์šฉ์—์„œ ๋‚˜์™”๋‹ค.

๋ญ”๊ฐ€ ๊ธฐ๋ณธ ํƒ€์ž…์ฒ˜๋Ÿผ ๊ฐ€๋ณ๊ฒŒ ๋””์ž์ธํ•ด๋†”์„œ ์ƒ๊ฐ์—†์ด ์“ฐ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์€๋ฐ, map์€ ๊ทธ๋Ÿฌ๋ฉด ์•ˆ๋œ๋‹ค.

์‹ฌ์ง€์–ด Go์—์„œ ๋ฉ”์ด์ €ํ•œ ๋ชจ๋“ˆ๋“ค๋„ map์„ ์›์‹œ์ธ์ฒ˜๋Ÿผ ์จ์„œ ๋ฌด์˜๋ฏธํ•œ ๋ฆฌ์†Œ์Šค ๋ณ‘๋ชฉ์„ ์ผ์œผํ‚ค๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ข…์ข… ๋ณด์˜€๋‹ค. ํŠนํžˆ logrus๋ผ๋Š” ๋กœ๊ฑฐ ๋ชจ๋“ˆ์ด ๊ทธ๋žฌ๋Š”๋ฐ, ํ•„๋“œ ํ• ๋‹นํ• ๋•Œ๋งˆ๋‹ค ๋งต์„ ์ „์ฒด ์žฌํ• ๋‹น-๋ฆฌํ•ด์‹ฑํ•˜๋Š” ์œ ์•„๊ธฐ์ ์ธ ์ฝ”๋“œ๋ฅผ ์งœ๋†จ๋”๋ผ. ๊ทธ๋ž˜์„œ ๋ฒ„๋ ธ๋‹ค.




ํ•ด์‹œํ…Œ์ด๋ธ”

map์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ‚ค-๊ฐ’์Œ์˜ ํ•ด์‹œํ…Œ์ด๋ธ”์ด๋‹ค.
์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ฒ„ํ‚ท์„ ๊ฐ€์ง€๋Š” ๋ฆฌ์ŠคํŠธ๋กœ ๊ตฌํ˜„์ด ๋œ๋‹ค.

๋‚ด๋ถ€ ํƒ€์ดํ•‘์„ ๊ฐœ๋–ก๊ฐ™์ด ํ•ด๋†”์„œ ์ด๊ฑธ๋กœ๋งŒ ์•Œ์•„๋ณด๊ธฐ๋Š” ์–ด๋ ต๋‹ค.

๊ทธ๋ฆผ์œผ๋กœ ํ‘œํ˜„ํ•˜์ž๋ฉด, map์€ ์ด๋Ÿฐ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„๋‹ค.

map ์ž์ฒด๋Š” ์ผ๋‹จ ํ•˜๋‚˜์˜ ๋ฐฐ์—ด์ด๋‹ค.
ํ‚ค๊ฐ’์ด ๋“ค์–ด์˜ค๋ฉด ๊ทธ๊ฑธ ํ•ด์‹ฑํ•ด์„œ ํ•ด์‹œ๊ฐ’์„ ๋ฐฐ์—ด ์ธ๋ฑ์Šค๋กœ ์‚ผ๊ณ , ๊ฐ’์„ ๋‚ด๋ถ€์— ์ €์žฅํ•  ๋ฟ์ด๋‹ค.

ํ•ด์‹œ๋Š” ๋‹น์—ฐํžˆ ์ถฉ๋Œํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์™„์ถฉ์žฅ์น˜๋ฅผ ๋‘๋Š”๋ฐ, go์˜ map์—์„œ๋Š” ๊ทธ๋ƒฅ ๊ณ ์ •๊ธธ์ด 8์งœ๋ฆฌ ๋ฐฐ์—ด์„ ๋ฒ„ํ‚ท์œผ๋กœ ์‚ผ์•„์„œ ์‹ฌ์–ด๋†“๋Š”๋‹ค. ๊ฝค๋‚˜ ์Œˆ๋ฐ•ํ•˜๊ณ  ๊ณ ์ „์ ์ธ ๋ฐฉ์‹์ด๋‹ค. ๋‹ค๋ฅธ ์–ธ์–ด๋“ค์€ bucket์— linked list๋‚˜ tree๋ฅผ ์“ฐ๊ธฐ๋„ ํ•œ๋‹ค.
๊ทธ๋ž˜์„œ go์˜ map์€ ๋ฒ„ํ‚ท์˜ ํ‰๊ท  ๊ธธ์ด๊ฐ€ 6.5 ์ด์ƒ์ด ๋˜๋ฉด ๋ฏธ์–ดํ„ฐ์ง€๋‹ˆ๊นŒ ๋ฏธ๋ฆฌ ์žฌํ• ๋‹น์„ ์‹œ๋„ํ•œ๋‹ค.




growing

map๋„ ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” ๊ตฌ์กฐ๊ฐ€ ๋ฐฐ์—ด์ด๋ผ๊ณ  ํ–ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์–ผ๋งˆ๋‚˜ ์“ธ์ง€๋ฅผ ๋ชจ๋ฅด๋‹ˆ, ํฌ๊ธฐ๋ฅผ ๋ฏธ๋ฆฌ ์ง€์ •ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ์ดˆ๊ธฐ๊ฐ’์€ ์ž‘๋‹ค. ๋ณดํ†ต ๋ฒ„ํ‚ท 1๊ฐœ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ ๊ฐ™๋”๋ผ.
๊ทธ๋ฆฌ๊ณ  ๊ธธ์ด๊ฐ€ ๊ฐ€๋“์ฐจ๋ฉด (ํ‰๊ท ๊ธธ์ด๊ฐ€ 6.5 ์ด์ƒ์ด ๋˜๋ฉด), slice์ฒ˜๋Ÿผ 2๋ฐฐ ํฌ๊ธฐ์˜ ์ƒˆ๋กœ์šด map์„ ๋งŒ๋“ค๊ณ  ๊ฑฐ๊ธฐ์— ๊ฐ’์„ ์˜ฎ๊ธด๋‹ค.

๊ทผ๋ฐ map์˜ growing์€ slice์˜ growing๋ณด๋‹ค ํ›จ์”ฌ ์‹ฌ๊ฐํ•˜๋‹ค.
slice๋Š” ๊ฐ’์„ copy๋งŒ ํ•˜๋ฉด ๋˜์ง€๋งŒ, map์€ ๊ฝค๋‚˜ ๋ฌด๊ฑฐ์šด ์—ฐ์‚ฐ์ธ hash๋ฅผ ์ž”๋œฉ ๋•Œ๋ฆฌ๋Š” rehashing ๊ณผ์ •์„ ๊ฑฐ์ณ์„œ ์˜ฎ๊ฒจ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด๊ฒŒ ์Œ“์ด๋ฉด ๊ฝค๋‚˜ ๋ฌด์‹œ๋ชปํ•  ์ˆ˜์ค€์ด ๋œ๋‹ค.


๊ทธ๋Ÿฐ ์ด์œ ์—์„œ ์ด๋Ÿฐ์‹์œผ๋กœ map์„ ๋ฌด์ž‘์ • ๋˜์ง€๊ณ  ์Œ“๋Š” ํ˜•ํƒœ๋Š” ์„ฑ๋Šฅ์ƒ ์ข‹์€ ์ฝ”๋“œ๊ฐ€ ๋˜๊ธฐ ์–ด๋ ต๋‹ค.
์ตœ์†Œ ์ˆ˜๋ฐฑ-์ˆ˜์ฒœ๊ฐœ์˜ ๋ฐ์ดํ„ฐ์…‹์„ ๋„ฃ๋Š”๋ฐ ์ด๋Ÿฐ์‹์œผ๋กœ ์งœ๋ฉด ํ„ฐ์ ธ๋„ ํ• ๋ง์ด ์—†๋‹ค.


๋˜๋„๋ก ์œ„์™€ ๊ฐ™์ด cap hint๋ฅผ ์ค˜์„œ map์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ์ข€ ์—ฌ์œ ๋ฅผ ์ค˜๋„ ๋œ๋‹ค.

์ด๋Ÿฌ๋ฉด 300๊ฐœ์˜ key-value๊ฐ€ ๋“ค์–ด๊ฐˆ ๊ฒƒ์ด๋ผ ์ถ”์ธกํ•˜๊ณ  ์—ฌ์œ ์žˆ๊ฒŒ map ๊ณต๊ฐ„์„ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ € ๊ฐœ์ˆ˜๋ณด๋‹ค ๋งŽ์ง€ ์•Š๋‹ค๋ฉด ๋ถˆํ•„์š”ํ•œ growing์€ ์ž˜ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ฒŒ ๋œ๋‹ค.


Go map ๊ตฌํ˜„์— ๋Œ€ํ•œ ์ฝ”๋“œ๋ฅผ ๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด ์•„๋ž˜ ๋งํฌ๋กœ ๋“ค์–ด๊ฐ€๋ณด๋ฉด ๋œ๋‹ค.
https://go.dev/src/runtime/map.go


์ฐธ์กฐ
https://go.dev/blog/maps
https://blog.frec.kr/golang/go-hashtable-0/
https://hackernoon.com/some-insights-on-maps-in-golang-rm5v3ywh