[Go] Profile-guided optimization (PGO)

PGO๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•ด์„œ ์ˆ˜์ง‘ํ•œ ํ”„๋กœํŒŒ์ผ ๋ฐ์ดํ„ฐ๋กœ ์ตœ์ ํ™”๋ฅผ ๋Œ๋ฆฌ๋Š” ๊ฐ€์žฅ ์‹ฌ์˜คํ•œ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์ด๋‹ค.
Go๋„ ์ตœ๊ทผ์— ์ง€์›ํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค. ๋ฒ„์ „ 1.20๋ถ€ํ„ฐ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

์žฅ์ 
์„ฑ๋Šฅ์ด ๋นจ๋ผ์ง„๋‹ค. ๋ณดํ†ต์€ 2-4% ์ •๋„๊ณ , ๊ทน์ ์ธ ๊ฒฝ์šฐ๋Š” ์•„์ง ๋งŽ์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™๋‹ค.

๋‹จ์ 
ํ˜„์žฌ ์•Œ๋ ค์ง„ ๋ฐ”๋กœ๋Š”, ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ ์˜คํžˆ๋ ค ๋” ์ปค์งˆ ์ˆ˜๋Š” ์žˆ๋‹ค. Rust PGO๋Š” ๋” ์ž‘์•„์ง€๋˜๋ฐ ์™œ์ง€..?
๊ทธ๋ฆฌ๊ณ  ๋‹น์—ฐํ•˜์ง€๋งŒ ๋นŒ๋“œ ์‹œ๊ฐ„์ด ์˜ค๋ž˜๊ฑธ๋ฆฐ๋‹ค.

์•„์ง ๋‚˜์˜จ์ง€ ์–ผ๋งˆ ๋˜์ง€๋„ ์•Š์•˜๊ณ , ๊ธฐ๋Šฅ๋„ ๋งค์šฐ ๋ถ€์‹คํ•ด์„œ ์‚ฌ์‹ค ๊ตณ์ด ์“ธ ์ด์œ ๋Š” ์—†๋‹ค.
์ข€๋” ๊ธฐ๋‹ค๋ ค์•ผ ํ•  ๊ฒƒ์ด๋‹ค...




ํ”„๋กœํŒŒ์ผ๋ง

PGO๋ฅผ ๋จน์ด๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ”„๋กœํŒŒ์ผ๋ง์„ ํ†ตํ•ด ํ•ด๋‹น ๋จธ์‹ ์—์„œ ๋ฐœ์ƒํ•œ ์‹คํ–‰ ๋กœ๊ทธ ๊ธฐ๋ก์ด ํ•„์š”ํ•˜๋‹ค.

๋ณ„๋„ ํฌ์ŠคํŠธ๋ฅผ ์ฐธ์กฐํ•˜๋ฉด ์ข‹๊ฒ ๋‹ค.
https://blog.naver.com/sssang97/223176350882
์—ฌ๊ธฐ์„œ๋Š” ํ”„๋กœํŒŒ์ผ๋ง์— ๋Œ€ํ•ด์„œ๋Š” ์ ๋‹นํžˆ ๋„˜๊ธฐ๊ฒ ๋‹ค.




์˜ˆ์ œ ์ฝ”๋“œ

์•„๋ž˜๋Š” Hello API์™€ ํ”ผ๋ณด๋‚˜์น˜ ๊ณ„์‚ฐ API๊ฐ€ ์žˆ๋Š” ๊ฐ„๋‹จํ•œ ์„œ๋ฒ„ ์ฝ”๋“œ๋‹ค.

package main

import (
	"fmt"
	"net/http"
	_ "net/http/pprof"
	"strconv"
)

func fibonacci(n int) int {
	if n <= 1 {
		return n
	}
	return fibonacci(n-1) + fibonacci(n-2)
}

func main() {
	// ๊ฐ„๋‹จํ•œ http ์„œ๋ฒ„ ์˜ˆ์ œ
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprintf(w, "Hello, World!")
	})

	http.HandleFunc("/fibonacci", func(w http.ResponseWriter, r *http.Request) {
		n, error := strconv.Atoi(r.URL.Query().Get("n"))

		if error != nil {
			fmt.Fprintf(w, "์ˆซ์ž๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.")
			return
		}

		result := fibonacci(n)

		fmt.Fprintf(w, fmt.Sprintf("ํ”ผ๋ณด๋‚˜์น˜ %d๋ฒˆ์งธ ์ˆ˜๋Š” %d์ž…๋‹ˆ๋‹ค.", n, result))
	})

	fmt.Println("์„œ๋ฒ„ ์‹œ์ž‘ ์ค‘...")
	err := http.ListenAndServe(":8080", nil)
	if err != nil {
		fmt.Println("์„œ๋ฒ„ ์‹œ์ž‘ ์‹คํŒจ: ", err)
	}
}

ํ”„๋กœํŒŒ์ผ๋ง์„ ์œ„ํ•ด์„œ "net/http/pprof"๋ฅผ importํ–ˆ๋‹ค๋Š”๊ฒŒ ์œ ์ผํ•œ ํŠน์ด์ ์ด๋‹ค.

์ €๋ ‡๊ฒŒ ํ•ด์„œ ๋นŒ๋“œํ•˜๊ณ 

์‹คํ–‰ํ•ด๋ณธ๋‹ค.

๊ทธ๋ฆฌ๊ณ  pprof ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ด์„œ ํ”„๋กœํŒŒ์ผ ์ •๋ณด๋ฅผ ๋‹ค์šด๋ฐ›๋Š”๋‹ค.

ํ”„๋กœํŒŒ์ผ ํŒŒ์ผ์„ ์ ๋‹นํžˆ *.pgo์™€ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ์˜ฎ๊ฒจ์ค€๋‹ค.
๋ณดํ†ต์€ default.pgo๋กœ ํ•˜๋Š”๊ฒŒ ๊ถŒ์žฅ๋œ๋‹ค. ์ด๋ ‡๊ฒŒ ์ง€์–ด๋‘๋ฉด auto ๋ชจ๋“œ์—์„œ ์ž๋™์œผ๋กœ ์ฝ์–ด๊ฐ„๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋นŒ๋“œํ• ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด pgo ์˜ต์…˜์„ ์ค˜์„œ ๋นŒ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด

PGO ๋นŒ๋“œ๊ฐ€ ์™„๋ฃŒ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

์•ˆํƒ€๊น๊ฒŒ๋„ ์ด๋Ÿฐ ๊ฐ„๋‹จํ•œ ์ผ€์ด์Šค์—์„œ๋Š” pgo๋กœ ์ธํ•œ ๋ญ”๊ฐ€ ๊ฐœ์„ ์ด ์ผ์–ด๋‚˜์ง„ ์•Š๋Š” ๊ฒƒ ๊ฐ™์•˜๋‹ค.
์„ฑ๋Šฅ๋„ ๋ณ„ ์ฐจ์ด๋Š” ์—†๊ณ , ๋ฐ”์ด๋„ˆ๋ฆฌ ์‚ฌ์ด์ฆˆ์—๋„ ์ฐจ์ด๋Š” ์—†์—ˆ๋‹ค.



์ฐธ์กฐ
https://go.dev/doc/pgo
https://www.pixelstech.net/article/1677391324-Understanding-PGO-in-GoLang-1-20