Go optimalizacia - pointer vs receiver

hknmtt

Go optimalizacia - pointer vs receiver
« kdy: 22. 01. 2023, 09:19:44 »
Benchmark jasne ukazuje ze pouzivat pointer metody je 2x pomalsie nez pouzivat value metody. To je v pohode lebo sa to da lahko odlisit podla toho ci ide o mutacnu metodu alebo nie. Ale rozmyslal som o navratovych hodnotach. Casto sa totiz robia funkcie na styl

Kód: [Vybrat]
func Foo() (*Bar, error) {}
Tam je totozna situacia ze pointer je 2x narocnejsi na spracovanie(heap vs stack).

Testovanie mi ukazalo ze penalizacia zalezi od toho co sa s navratovou hodnotou robi(escape analyza go runtime), primarne ako daleko hodnota cestuje. V kazdom pripade som rozmyslal ze co keby navratova hodnota vyzerala takto:

Kód: [Vybrat]
type Foo struct {
  err string
  Bar int
  Baz string
}

func (f Foo) Error() {
  return f.err
}

func DoStuff() Foo {
  if failed {
    return Foo{err: "chyba"}
  }
  return Foo{Bar: 10, Baz: "ok"}
}

func main() {
  result := DoStuff()
  if result.Error() != "" {
    log.Fatal(result.Error())
  }
  log.Println("all good")
}

Cize Foo matchne error interfejs ale ako hodnota, nie ako pointer a teda namiesto dvoch pointerov (return *Foo, error) je len jedna hodnota Foo ktora vie predat informaciu ci error bol alebo ci je vysledok ok a moze sa s nim pracovat dalej.


To len tak teoreticky premyslam na hlas, ci sa oplati optimalizovat kod takto alebo ani nie... napriklad pri vytazenom http serveri ktory riesi miliony requestov denne by to mohlo pridat par percent na vykone. Problem je ze to by cela codebase musela byt takto prerobena. Dalsi problem je, v pripade http serveru, ze v pripade serializacie(json, xml, yaml,...) by nefungovali omitempty tagy co je dost velky problem kedze sa tym straca informacia o data present vs data not-present.

Diskutovat o pointer vs value v go je taka zaciatocnicka otazka ktoru myslim riesia vseci novoprichodilci ale casom proste pouzivaju aj tak pointery lebo je to standard v 99% pripadoch. Ale teraz po rokoch nad tym rozmyslam znovu, ci to ma vyznam sa tym zaoberat alebo nie.


Re:Go optimalizacia - pointer vs receiver
« Odpověď #1 kdy: 22. 01. 2023, 09:56:06 »
Benchmark jasne ukazuje ze pouzivat pointer metody je 2x pomalsie nez pouzivat value metody.

Skutecne to benchmark ukazuje? To je ta struktura prazdna? Tam prece musi byt pro nepraznou metodu videt volani "duffcopy" a uz od cca nejakych 20 bajtu by se to melo projevit ne?

Idris

  • *****
  • 2 286
    • Zobrazit profil
    • E-mail
Re:Go optimalizacia - pointer vs receiver
« Odpověď #2 kdy: 22. 01. 2023, 12:00:58 »
Tohle nemá smysl řešit, vrací se buď výsledek, nebo chyba, můžu mít třeba (Bar, error), chyba bude většinou nil. Efektivita alokace na haldě závisí na velikosti struktury, vicevláknovosti a typu CPU, mikrobenchmarky bych nebral moc vážně.

hknmtt

Re:Go optimalizacia - pointer vs receiver
« Odpověď #3 kdy: 22. 01. 2023, 12:07:01 »
Tohle nemá smysl řešit, vrací se buď výsledek, nebo chyba, můžu mít třeba (Bar, error), chyba bude většinou nil. Efektivita alokace na haldě závisí na velikosti struktury, vicevláknovosti a typu CPU, mikrobenchmarky bych nebral moc vážně.

Jasne, beriem. Len ono ide o to ze error je vzdy pointer lebo je zvyk robit err == nil, lenze ked sa vrati sturktura bez pointeru ktora nesie rovnaku informaciu tak je to imho lepsie nez dve sturktury kde su obe pointery.

Idris

  • *****
  • 2 286
    • Zobrazit profil
    • E-mail
Re:Go optimalizacia - pointer vs receiver
« Odpověď #4 kdy: 22. 01. 2023, 13:58:47 »
Tohle nemá smysl řešit, vrací se buď výsledek, nebo chyba, můžu mít třeba (Bar, error), chyba bude většinou nil. Efektivita alokace na haldě závisí na velikosti struktury, vicevláknovosti a typu CPU, mikrobenchmarky bych nebral moc vážně.
Jasne, beriem. Len ono ide o to ze error je vzdy pointer lebo je zvyk robit err == nil, lenze ked sa vrati sturktura bez pointeru ktora nesie rovnaku informaciu tak je to imho lepsie nez dve sturktury kde su obe pointery.
Ono error je rozhraní, jehož implementace je na uvážení překladače. Když se vrací struktura hodnotou a chyba je v naprosté většině případů nil, nic se na haldě nealokuje, není tedy důvod opouštět idiomatické vracení chyb, které má Go velmi dobře promyšlené (viz balíček errors).


Re:Go optimalizacia - pointer vs receiver
« Odpověď #5 kdy: 22. 01. 2023, 23:49:12 »
To len tak teoreticky premyslam na hlas, ci sa oplati optimalizovat kod takto alebo ani nie...

Když o tom jen takhle musíš přemýšlet nahlas, tak ne.

Idris

  • *****
  • 2 286
    • Zobrazit profil
    • E-mail
Re:Go optimalizacia - pointer vs receiver
« Odpověď #6 kdy: 22. 01. 2023, 23:53:25 »
To len tak teoreticky premyslam na hlas, ci sa oplati optimalizovat kod takto alebo ani nie...
Když o tom jen takhle musíš přemýšlet nahlas, tak ne.
Tak ale otázka to je dobrá.