[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