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

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:


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 »
Citace od: hknmtt kdy 22. 01. 2023, 09:19:44
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
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 »
Citace od: Idris 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ě.

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
Re:Go optimalizacia - pointer vs receiver
« Odpověď #4 kdy: 22. 01. 2023, 13:58:47 »
Citace od: hknmtt kdy 22. 01. 2023, 12:07:01
Citace od: Idris 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ě.
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).


Tomáš Procházka

  • ***
  • 139
  • Místo: Pardubice
Re:Go optimalizacia - pointer vs receiver
« Odpověď #5 kdy: 22. 01. 2023, 23:49:12 »
Citace od: hknmtt kdy 22. 01. 2023, 09:19:44
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
Re:Go optimalizacia - pointer vs receiver
« Odpověď #6 kdy: 22. 01. 2023, 23:53:25 »
Citace od: Tomáš Procházka kdy 22. 01. 2023, 23:49:12
Citace od: hknmtt kdy 22. 01. 2023, 09:19:44
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á.