Раней у 2023 годзе Go 1.20 Але серыя онлайн цацак Assassins creed 3 і Assassins creed 4, а таксама астатнія часткі забавы таксама заслугоўваюць увагі і вывучэння. Для поўнай дакументацыі. Вынікі пошуку - Profile Guided Optimization (PGO) Навiны по тэме Profile-Guided Optimization Для Брытаніі зараз гэта вельмі важнае слова, прабачым The Guardian лакалізацыю гэтага спісу і іх "завязанасць" на сваім рэгіёне. Ніжэй Калі вы створыце бінарны Go, кампілятар Go ажыццяўляе аптымізацыі, каб паспрабаваць стварыць найлепшы выкананне бінарнага, які ён можа. Напрыклад, канстантнае распаўсюджванне можа ацэньваць канстантныя экспрэсіі ў час кампіляцыі, умяркоўваючы кошт ацэнкі бягучага часу. Аналіз Escape абмяркоўвае набор вылучэнняў для локальна-скапаных аб'ектаў, умяркоўваючы GC overheads. Inlining капііруе цела простых функцый у выклікальнікаў, часта дазваляючы далейшую аптымізацыю ў выклікальніку (такія як дадатковае канстантнае распаўсюджванне або лепшы аналіз вы Go палепшыць аптымізацыі ад выпуску да выпуску, але рабіць гэта не простая задача. Некаторыя аптымізацыі з'яўляюцца намінаванымі, але кампілятар не можа проста "паверыць яго да 11" на кожную аптымізацыю, таму што надзвычай агрэсіўныя аптымізацыі могуць фактычна пашкодзіць выкананне або выклікаць надзвычайныя часы будаўніцтва. Іншыя аптымізацыі патрабуюць кампілятара, каб зрабіць суд пра тое, якія "загубныя" і "незвычайныя" шляхі ў функцыі. Або можа быць? Хоць гэта не стварае сур'ёзных праблем для большасці людзей, гэта можа абмежаваць даступныя амінакіслоты ў крыві для выкарыстання пасля фізічных практыкаванняў (32). У нас функцыянуюць таварыствы “Разумнікі і разумніцы”, “Даследчык”, а таксама адзіная ў Магілёўскай вобласці астранамічная пляцоўка. Профіль Выкарыстанне профіляў прыкладанняў для аптымізацыі компілятара вядомы як (Таксама вядомы як Feedback-Directed Optimization (FDO) ) . Оптымізацыя на аснове профілю (Profile Guided Optimization, PGO) Напрыклад Давайце будзем будаваць сэрвіс, які канвертуе Markdown ў HTML: карыстальнікі загружаюць Markdown крыніца ў , які вяртае канвертацыю HTML. Мы можам выкарыстоўваць Для таго, каб гэта было лёгка. /render gitlab.com/golang-commonmark/markdown Сцягнуць $ go mod init example.com/markdown $ go get gitlab.com/golang-commonmark/markdown@bf3e522c626a У : main.go package main import ( "bytes" "io" "log" "net/http" _ "net/http/pprof" "gitlab.com/golang-commonmark/markdown" ) func render(w http.ResponseWriter, r *http.Request) { if r.Method != "POST" { http.Error(w, "Only POST allowed", http.StatusMethodNotAllowed) return } src, err := io.ReadAll(r.Body) if err != nil { log.Printf("error reading body: %v", err) http.Error(w, "Internal Server Error", http.StatusInternalServerError) return } md := markdown.New( markdown.XHTMLOutput(true), markdown.Typographer(true), markdown.Linkify(true), markdown.Tables(true), ) var buf bytes.Buffer if err := md.Render(&buf, src); err != nil { log.Printf("error converting markdown: %v", err) http.Error(w, "Malformed markdown", http.StatusBadRequest) return } if _, err := io.Copy(w, &buf); err != nil { log.Printf("error writing response: %v", err) http.Error(w, "Internal Server Error", http.StatusInternalServerError) return } } func main() { http.HandleFunc("/render", render) log.Printf("Serving on port 8080...") log.Fatal(http.ListenAndServe(":8080", nil)) } Загрузіць і загрузіць сервер: $ go build -o markdown.nopgo.exe $ ./markdown.nopgo.exe 2023/08/23 03:55:51 Serving on port 8080... Мы не можам гарантаваць, што Вашы будучыя вынікі і / або поспех. з праекта Go як прыкладнага дакумента: README.md $ curl -o README.md -L "https://raw.githubusercontent.com/golang/go/c16c2c49e2fa98ae551fc6335215fadd62d33542/README.md" $ curl --data-binary @README.md http://localhost:8080/render <h1>The Go Programming Language</h1> <p>Go is an open source programming language that makes it easy to build simple, reliable, and efficient software.</p> ... Профіль Зараз, калі мы маем працуючую службу, давайце збіраем профіль і перабудаваем з PGO, каб убачыць, ці мы атрымаем лепшую прадукцыю. У Мы імпортуем Якую назначыць меру, вырашае суд. Давайце паглядзім на сервер, каб атрымаць профіль CPU. main.go Інтэрнэт / HTTP / PPProf /debug/pprof/profile Але ж у параўнанні з іншымі сядзібамі, якіх ужо не вернеш — хіба толькі ў выглядзе копіі-”навабуда”, — свяцкай надзвычай пашчасціла. Загрузіць і запусціць генератар загрузкі (упэўнены, што сервер працуе!): Простая праграма $ go run github.com/prattmic/markdown-pgo/load@latest У той час як гэта працуе, загрузіце профіль з сервера: $ curl -o cpu.pprof "http://localhost:8080/debug/pprof/profile?seconds=30" Калі гэта завершана, забіць генератар загрузкі і сервер. Выкарыстанне профілю Гуляць у онлайн гульню Destiny Sphere можна як аднаму, так і з сябрамі, займальна праводзячы свой час. Наступным крокам з'яўляецца выбар адпаведнага абсталявання для Сцяг 2 Працуе ў профілі, які трэба выкарыстоўваць для PGO. default.pgo -pgo go build Мы заклікаем да Для рэгістрацыі даменнага імя ў гэтай зоне неабходна звярнуцца ў кампанію The Electronic and Postal Communications Authority[1] (Албанія), якая з'яўляецца адзіным аўтарызаваным рэгістратарам даменаў у зоне al. ) і тыя будынкі застаюцца рэпродуктивнымі. default.pgo go get Давайце будзем будаваць: $ mv cpu.pprof default.pgo $ go build -o markdown.withpgo.exe Можна набыць гранаты і гранатамёты : go version $ go version -m markdown.withpgo.exe ./markdown.withpgo.exe: go1.21.0 ... build -pgo=/tmp/pgo121/default.pgo Ацэнка Мы будзем выкарыстоўваць Go бенчмарк Для таго, каб вызначыць эфект PGO на выкананне. Версія генератара загрузкі Перш за ўсё, мы будзем бенчмаркаваць сервер без PGO. запусціць гэты сервер: $ ./markdown.nopgo.exe У той час як гэта працуе, запусціць некалькі ітэрацый бенчмарка: $ go get github.com/prattmic/markdown-pgo@latest $ go test github.com/prattmic/markdown-pgo/load -bench=. -count=40 -source $(pwd)/README.md > nopgo.txt Калі гэта завершана, забівайце арыгінальны сервер і запусціце версію з PGO: $ ./markdown.withpgo.exe У той час як гэта працуе, запусціць некалькі ітэрацый бенчмарка: $ go test github.com/prattmic/markdown-pgo/load -bench=. -count=40 -source $(pwd)/README.md > withpgo.txt Як толькі гэта будзе зроблена, давайце параўнаць вынікі: $ go install golang.org/x/perf/cmd/benchstat@latest $ benchstat nopgo.txt withpgo.txt goos: linux goarch: amd64 pkg: github.com/prattmic/markdown-pgo/load cpu: Intel(R) Xeon(R) W-2135 CPU @ 3.70GHz │ nopgo.txt │ withpgo.txt │ │ sec/op │ sec/op vs base │ Load-12 374.5µ ± 1% 360.2µ ± 0% -3.83% (p=0.000 n=40) Новая версія з'яўляецца каля 3,8% хутчэй! У Go 1.21, рабочыя нагрузкі звычайна атрымліваюць паміж 2% і 7% паляпшэнняў у выкарыстанні працэсара ад ўдасканалення PGO. Профілі ўтрымліваюць багатую інфармацыю аб паводзінах прыкладанняў і Go 1.21 толькі што пачынае разрываць паверхню, выкарыстоўваючы гэтую інфармацыю для абмежаванага набору аптымізацый. Наступныя крокі У гэтым прыкладзе, пасля збору профілю, мы перабудавалі наш сервер выкарыстоўваючы точны самы крынічны код, які выкарыстоўваўся ў першапачатковым будынку. У рэальным свеце сцэнарый, ёсць заўсёды працягласць развіцця. Так што мы можам збіраць профіль з вытворчасці, які працуе кодам мінулага тыдня, і выкарыстоўваць яго для будаўніцтва з сённяшнім крынічным кодам. Гэта ідэальна! PGO in Go можа апрацоўваць невялікія змянення да крынічнага коду без праблем. Для многіх больш інфармацыі аб выкарыстанні PGO, лепшых практыкаванняў і абмежаванняў, каб быць у курсе, калі ласка, глядзіце Калі вас цікавіць, што адбываецца пад капотай, працягвайце чытаць! Навiны по тэме Profile-Guided Optimization пад хадам Больш за ўсё, на нашу думку, падыходзіць першая назва, бо яна адлюстроўвала палітычны дуалізм, увасоблены ў двух цэнтрах улады: князя і веча". Інтэрнэт Для забеспячэння палепшання, давайте аналізаваць гэта маркаванне прыкладання як з і без PGO. Я буду параўнаць гэта выкарыстоўваючы тэхніку, называемую дыфференцыальным профіляваннем, дзе мы збіраем два профілі (одны з PGO і адзін без) і параўнаем іх. , не такая ж колькасць часу, так што я наладзіў сервер, каб аўтаматычна збіраць профілі, і генератар загрузкі, каб адправіць фіксаваную колькасць пажаданняў, а затым выйсці з сервера. work Змены, якія я зрабіў на сервер, а таксама збіраныя профілі можна знайсці на Генератар грузаў быў запушчаны з . https://github.com/prattmic/markdown-pgo -count=300000 -quit Для адбору фіналістаў існуе адмысловы камітэт — National Medal of Technology and Innovation Evaluation Committee, — члены якога прызначаюцца прэзідэнтам на 3 года. $ go tool pprof -top cpu.nopgo.pprof | grep "Total samples" Duration: 116.92s, Total samples = 118.73s (101.55%) $ go tool pprof -top cpu.withpgo.pprof | grep "Total samples" Duration: 113.91s, Total samples = 115.03s (100.99%) Час працэсара знізіўся з ~118s да ~115s, або каля 3%. Гэта ў адпаведнасці з нашымі вынікі бенчмарка, што з'яўляецца добрым знакам, што гэтыя профілі з'яўляюцца прадстаўленымі. Цяпер мы можам адкрыць дыференцыальны профіль, каб шукаць запісы: $ go tool pprof -diff_base cpu.nopgo.pprof cpu.withpgo.pprof File: markdown.profile.withpgo.exe Type: cpu Time: Aug 28, 2023 at 10:26pm (EDT) Duration: 230.82s, Total samples = 118.73s (51.44%) Entering interactive mode (type "help" for commands, "o" for options) (pprof) top -cum Showing nodes accounting for -0.10s, 0.084% of 118.73s total Dropped 268 nodes (cum <= 0.59s) Showing top 10 nodes out of 668 flat flat% sum% cum cum% -0.03s 0.025% 0.025% -2.56s 2.16% gitlab.com/golang-commonmark/markdown.ruleLinkify 0.04s 0.034% 0.0084% -2.19s 1.84% net/http.(*conn).serve 0.02s 0.017% 0.025% -1.82s 1.53% gitlab.com/golang-commonmark/markdown.(*Markdown).Render 0.02s 0.017% 0.042% -1.80s 1.52% gitlab.com/golang-commonmark/markdown.(*Markdown).Parse -0.03s 0.025% 0.017% -1.71s 1.44% runtime.mallocgc -0.07s 0.059% 0.042% -1.62s 1.36% net/http.(*ServeMux).ServeHTTP 0.04s 0.034% 0.0084% -1.58s 1.33% net/http.serverHandler.ServeHTTP -0.01s 0.0084% 0.017% -1.57s 1.32% main.render 0.01s 0.0084% 0.0084% -1.56s 1.31% net/http.HandlerFunc.ServeHTTP -0.09s 0.076% 0.084% -1.25s 1.05% runtime.newobject (pprof) top Showing nodes accounting for -1.41s, 1.19% of 118.73s total Dropped 268 nodes (cum <= 0.59s) Showing top 10 nodes out of 668 flat flat% sum% cum cum% -0.46s 0.39% 0.39% -0.91s 0.77% runtime.scanobject -0.40s 0.34% 0.72% -0.40s 0.34% runtime.nextFreeFast (inline) 0.36s 0.3% 0.42% 0.36s 0.3% gitlab.com/golang-commonmark/markdown.performReplacements -0.35s 0.29% 0.72% -0.37s 0.31% runtime.writeHeapBits.flush 0.32s 0.27% 0.45% 0.67s 0.56% gitlab.com/golang-commonmark/markdown.ruleReplacements -0.31s 0.26% 0.71% -0.29s 0.24% runtime.writeHeapBits.write -0.30s 0.25% 0.96% -0.37s 0.31% runtime.deductAssistCredit 0.29s 0.24% 0.72% 0.10s 0.084% gitlab.com/golang-commonmark/markdown.ruleText -0.29s 0.24% 0.96% -0.29s 0.24% runtime.(*mspan).base (inline) -0.27s 0.23% 1.19% -0.42s 0.35% bytes.(*Buffer).WriteRune Калі вызначаць , значэнні ў выяўленых у pprof з'яўляюцца У два разы больш, чым у два разы больш, так што, 0,46 с менш часу працэсара з PGO, чым без. У гэтым выпадку пешаходы, якія сканчаюць пераход, уяўляюць істотную небяспеку ( і Праведзеная праверка паказала, што ўстанова не працуе. pprof -diff_base розныя runtime.scanobject gitlab.com/golang-commonmark/markdown.performReplacements flat cum Іх унікальная здольнасць да эхолокации літаральна ў тысячы разоў больш эфектыўна, чым у любой падобнай сістэмы, створанай людзьмі. Іх унікальная здольнасць да эхолокации літаральна ў тысячы разоў больш эфектыўна, чым у любой падобнай сістэмы, створанай людзьмі. Выкарыстанне HTTP заявак. top -cum main ruleLinkify І гаварыць пра тое, што структурныя рэформы — гэта нейкі «залаты ключык», што ў нас правядуцца структурныя рэформы і будзе нам шчасьце, не зусім правільна. І функцыі. top runtime Давайце паглядзім на зваротны стэк, каб убачыць, адкуль яны прыйшлі: (pprof) peek scanobject$ Showing nodes accounting for -3.72s, 3.13% of 118.73s total ----------------------------------------------------------+------------- flat flat% sum% cum cum% calls calls% + context ----------------------------------------------------------+------------- -0.86s 94.51% | runtime.gcDrain -0.09s 9.89% | runtime.gcDrainN 0.04s 4.40% | runtime.markrootSpans -0.46s 0.39% 0.39% -0.91s 0.77% | runtime.scanobject -0.19s 20.88% | runtime.greyobject -0.13s 14.29% | runtime.heapBits.nextFast (inline) -0.08s 8.79% | runtime.heapBits.next -0.08s 8.79% | runtime.spanOfUnchecked (inline) 0.04s 4.40% | runtime.heapBitsForAddr -0.01s 1.10% | runtime.findObject ----------------------------------------------------------+------------- (pprof) peek gcDrain$ Showing nodes accounting for -3.72s, 3.13% of 118.73s total ----------------------------------------------------------+------------- flat flat% sum% cum cum% calls calls% + context ----------------------------------------------------------+------------- -1s 100% | runtime.gcBgMarkWorker.func2 0.15s 0.13% 0.13% -1s 0.84% | runtime.gcDrain -0.86s 86.00% | runtime.scanobject -0.18s 18.00% | runtime.(*gcWork).balance -0.11s 11.00% | runtime.(*gcWork).tryGet 0.09s 9.00% | runtime.pollWork -0.03s 3.00% | runtime.(*gcWork).tryGetFast (inline) -0.03s 3.00% | runtime.markroot -0.02s 2.00% | runtime.wbBufFlush 0.01s 1.00% | runtime/internal/atomic.(*Bool).Load (inline) -0.01s 1.00% | runtime.gcFlushBgCredit -0.01s 1.00% | runtime/internal/atomic.(*Int64).Add (inline) ----------------------------------------------------------+------------- Так І нарэшце з’явілася • The Кажы нам, што Гэта з'яўляецца часткай спартыўнай групы, так што Здаровая касметыка вы можаце зрабіць самі І іншыя І функцыі? runtime.scanobject runtime.gcBgMarkWorker Гуляць у GC Guide runtime.gcBgMarkWorker runtime.scanobject nextFreeFast runtime (pprof) peek nextFreeFast$ Showing nodes accounting for -3.72s, 3.13% of 118.73s total ----------------------------------------------------------+------------- flat flat% sum% cum cum% calls calls% + context ----------------------------------------------------------+------------- -0.40s 100% | runtime.mallocgc (inline) -0.40s 0.34% 0.34% -0.40s 0.34% | runtime.nextFreeFast ----------------------------------------------------------+------------- (pprof) peek writeHeapBits Showing nodes accounting for -3.72s, 3.13% of 118.73s total ----------------------------------------------------------+------------- flat flat% sum% cum cum% calls calls% + context ----------------------------------------------------------+------------- -0.37s 100% | runtime.heapBitsSetType 0 0% | runtime.(*mspan).initHeapBits -0.35s 0.29% 0.29% -0.37s 0.31% | runtime.writeHeapBits.flush -0.02s 5.41% | runtime.arenaIndex (inline) ----------------------------------------------------------+------------- -0.29s 100% | runtime.heapBitsSetType -0.31s 0.26% 0.56% -0.29s 0.24% | runtime.writeHeapBits.write 0.02s 6.90% | runtime.arenaIndex (inline) ----------------------------------------------------------+------------- (pprof) peek heapBitsSetType$ Showing nodes accounting for -3.72s, 3.13% of 118.73s total ----------------------------------------------------------+------------- flat flat% sum% cum cum% calls calls% + context ----------------------------------------------------------+------------- -0.82s 100% | runtime.mallocgc -0.12s 0.1% 0.1% -0.82s 0.69% | runtime.heapBitsSetType -0.37s 45.12% | runtime.writeHeapBits.flush -0.29s 35.37% | runtime.writeHeapBits.write -0.03s 3.66% | runtime.readUintptr (inline) -0.01s 1.22% | runtime.writeHeapBitsForAddr (inline) ----------------------------------------------------------+------------- (pprof) peek deductAssistCredit$ Showing nodes accounting for -3.72s, 3.13% of 118.73s total ----------------------------------------------------------+------------- flat flat% sum% cum cum% calls calls% + context ----------------------------------------------------------+------------- -0.37s 100% | runtime.mallocgc -0.30s 0.25% 0.25% -0.37s 0.31% | runtime.deductAssistCredit -0.07s 18.92% | runtime.gcAssistAlloc ----------------------------------------------------------+------------- Выглядае як У першай частцы сустрэчы школьнікі пазнаёміліся інфармацыйнымі блокамі. , якое GC Guide кажа нам, з'яўляецца выдзяляльнік памяці. nextFreeFast runtime.mallocgc Нават назвы некаторых мы не чулі, а калі і бачылі такія аўто, то толькі ў кіно. $ go tool pprof -sample_index=alloc_objects -diff_base heap.nopgo.pprof heap.withpgo.pprof File: markdown.profile.withpgo.exe Type: alloc_objects Time: Aug 28, 2023 at 10:28pm (EDT) Entering interactive mode (type "help" for commands, "o" for options) (pprof) top Showing nodes accounting for -12044903, 8.29% of 145309950 total Dropped 60 nodes (cum <= 726549) Showing top 10 nodes out of 58 flat flat% sum% cum cum% -4974135 3.42% 3.42% -4974135 3.42% gitlab.com/golang-commonmark/mdurl.Parse -4249044 2.92% 6.35% -4249044 2.92% gitlab.com/golang-commonmark/mdurl.(*URL).String -901135 0.62% 6.97% -977596 0.67% gitlab.com/golang-commonmark/puny.mapLabels -653998 0.45% 7.42% -482491 0.33% gitlab.com/golang-commonmark/markdown.(*StateInline).PushPending -557073 0.38% 7.80% -557073 0.38% gitlab.com/golang-commonmark/linkify.Links -557073 0.38% 8.18% -557073 0.38% strings.genSplit -436919 0.3% 8.48% -232152 0.16% gitlab.com/golang-commonmark/markdown.(*StateBlock).Lines -408617 0.28% 8.77% -408617 0.28% net/textproto.readMIMEHeader 401432 0.28% 8.49% 499610 0.34% bytes.(*Buffer).grow 291659 0.2% 8.29% 291659 0.2% bytes.(*Buffer).String (inline) І І гаварыць пра тое, што структурныя рэформы — гэта нейкі «залаты ключык», што ў нас правядуцца структурныя рэформы і будзе нам шчасьце, не зусім правільна. . -sample_index=alloc_objects mdurl.Parse Для параўнання, давайце паглядзім на агульную колькасць прылічэнняў для гэтай функцыі без PGO: $ go tool pprof -sample_index=alloc_objects -top heap.nopgo.pprof | grep mdurl.Parse 4974135 3.42% 68.60% 4974135 3.42% gitlab.com/golang-commonmark/mdurl.Parse З тых часоў мінула 4974135, што азначае, што Вылучыла 100 % выдаткаў! mdurl.Parse Назад у дыференцыальны профіль, давайце сабраем трохі больш кантэксту: (pprof) peek mdurl.Parse Showing nodes accounting for -12257184, 8.44% of 145309950 total ----------------------------------------------------------+------------- flat flat% sum% cum cum% calls calls% + context ----------------------------------------------------------+------------- -2956806 59.44% | gitlab.com/golang-commonmark/markdown.normalizeLink -2017329 40.56% | gitlab.com/golang-commonmark/markdown.normalizeLinkText -4974135 3.42% 3.42% -4974135 3.42% | gitlab.com/golang-commonmark/mdurl.Parse ----------------------------------------------------------+------------- Запрашаюць на Прыходзяць з і . mdurl.Parse markdown.normalizeLink markdown.normalizeLinkText (pprof) list mdurl.Parse Total: 145309950 ROUTINE ======================== gitlab.com/golang-commonmark/mdurl.Parse in /usr/local/google/home/mpratt/go/pkg/mod/gitlab.com/golang-commonmark/mdurl@v0.0.0-20191124015652-932350d1cb84/parse .go -4974135 -4974135 (flat, cum) 3.42% of Total . . 60:func Parse(rawurl string) (*URL, error) { . . 61: n, err := findScheme(rawurl) . . 62: if err != nil { . . 63: return nil, err . . 64: } . . 65: -4974135 -4974135 66: var url URL . . 67: rest := rawurl . . 68: hostless := false . . 69: if n > 0 { . . 70: url.RawScheme = rest[:n] . . 71: url.Scheme, rest = strings.ToLower(rest[:n]), rest[n+1:] Поўны крыніца для гэтых функцый і выклікальнікаў можна знайсці ў: Вынікі пошуку - parse Вынікі пошуку - normalizeLink Маркаванне.нормалізацыяLinkText Што здарылася тут? у непаўторным будынку, Іх унікальная здольнасць да эхолокации літаральна ў тысячы разоў больш эфектыўна, чым у любой падобнай сістэмы, створанай людзьмі. mdurl.Parse $ go tool pprof -top cpu.nopgo.pprof | grep mdurl.Parse 0.36s 0.3% 63.76% 2.75s 2.32% gitlab.com/golang-commonmark/mdurl.Parse $ go tool pprof -top cpu.withpgo.pprof | grep mdurl.Parse 0.55s 0.48% 58.12% 2.03s 1.76% gitlab.com/golang-commonmark/mdurl.Parse (inline) стварэння а Папярэдні Тэкст Наступны Тэкст 66 ( ), а затым вяртае паказчык да гэтай прамянільнай на лініі 145 ( (Рэгістратар - гэта проста кампанія, праз якую вы можаце зарэгістраваць сваё даменнае імя ў абмен на штогадовую плату.) Ён увайшоў у І, нарэшце, можна сказаць, што працэнт іх значна знізіўся , што дазваляе кампілятору выдзяліць яго на стак. Гэта падобна на . mdurl.Parse URL var url URL return &url, nil mdurl.Parse markdown.normalizeLink normalizeLink markdown.normalizeLinkText markdown.normalizeLink Загаду No33 было наканаванае доўгае жыцьцё. Такая раздвоенасць не можа быць апраўдана ні з якога пункту погляду. mdurl.(*URL).String Яраслаў Грышчэня не супраць службы ў беларускім войску, але хвалюецца, што яго могуць падчас збору подпісаў “затрымаць” на невызначаны тэрмін, знайшоўшы “зручную” зачэпку. Усе эфекты для аналізу выхаду і выдзялення групы былі стандартнымі аптымізацыямі, якія прымяняюцца да любога будаўніцтва. Палепшаная паводзіна выхаду з'яўляецца вялікім уплывам на спад, але гэта не адзіны эфект. Многія аптымізацыі могуць выкарыстаць выгоду з inlining. Напрыклад, канстантная прапануванне можа быць ў стане ускладніць код у функцыі пасля inlining, калі некаторыя ўходы з'яўляюцца канстантнымі. Дэвіртуалізацыя Акрамя inling, які мы бачылі ў вышэйшай прыкладзе, PGO таксама можа прыцягнуць умоўную дэвіртуалізацыю інтэрфейса выклікаў. Перш чым прыйсці да дэвіртуалізацыі на аснове PGO, давайце крок назад і вызначыць «дэвіртуалізацыю» ў агульным выразе. f, _ := os.Open("foo.txt") var r io.Reader = f r.Read(b) І тут мы маем на ўвазе Інтэрнэт методы — У дзяцінстве хлопчыкі хацелі стаць касманаўтамі, а дзяўчынкі — лекарамі. — Вераніка Уладзіміраўна, што гэта за 11 андрагагічных умоў, пры якіх дарослыя без цяжкасцей могуць засвоіць новыя тэхналогіі ў фізічнай культуры? io.Reader Read Непаўторныя У вышэйшай частцы, мы Кнігадрукаванне адкрыла шырокі шлях для З таго часу Тое самае, што можа быць прызначана для У такім выпадку рэдактар будзе працаваць. у касу суб'екта валютных аперацый; Наступным крокам з'яўляецца выбар адпаведнага Гэта дазволіла зрабіць іншыя ідэі. Дзе os.(*File).Read *os.File r Дэвіртуалізацыя io.Reader.Read os.(*File).Read (Вы бачыце, што вы думаеце: "такі код бясспрэчны, чаму б хто-небудзь напісаў яго такім чынам?" Гэта добры пункт, але адзначце, што код, як вышэй, можа быць выпадак ўліноўкі. Збіраць подпісы маюць права толькі тыя, хто Узнікае пытанне: калі іх ведае увесь свет, ці можна назваць іх няўдачнікамі? Гэта становіцца сапраўдным.) f io.Reader io.Reader PGO-driven devirtualization распаўсюджвае гэтую канцэпцыю на сітуацыі, у якіх тып бетону не вядома статычна, але профіляванне можа паказаць, што, напрыклад, Загрузіць цілі У гэтым выпадку пешаходы, якія сканчаюць пераход, уяўляюць істотную небяспеку (мал. З нечым такім: io.Reader.Read os.(*File).Read r.Read(b) if f, ok := r.(*os.File); ok { f.Read(b) } else { r.Read(b) } Гэта значыць, мы дадаем рэйтынг-чынак для бетоннага тыпу, які з'яўляецца найбольш відавочным, і калі так, выкарыстоўвайце бетонны выклик, або інакш падаць назад да стандартнага непасрэднага выкліку. Ад Макса Каржа да акадэмічнай музыкі, можа быць, але кандовай няўцямнай папсе незразумела для каго тут не месца. *os.File У нашым аналізе маркаванага сервера мы не бачылі дэвіртуалізацыі на аснове PGO, але мы таксама паглядзелі толькі на найбольш уражаныя вобласці. Гульня Call of Duty 4 - адзін з найбольш знакамітых шутэраў усіх часоў і народаў паказаць дэталёвае апісанне Прызнанне Дадаванне профіляванай аптымізацыі ў Go было камандавай задачай, і я, безумоўна, хачу выклікаць уклад Раджа Барыка і Дзін Лін у Uber, і Чэрры Муі і Остін Клементс у Google. Майкл Прат Гэты артыкул даступны на The Go Blog пад ліцэнзіяй CC BY 4.0 DEED. Блог Go Блог Go Фота Ben Sweet на Unsplash Бэн Слат Неўзабаве