Co se tyce knihoven vs vlastní kod, je tu este vykonovy aspekt.
Psal jsem nedavno jeden primitivni stream procesor, na stdin prijde hromada JSONu, udela to urcitou analyzu pres klouzave okno, vysype na stdout, slouzi jako plugin do jineho softu.
Prototyp v pythonu funguje ok.
Predelavka do go s ocekavanim narustu vykonu, realita, vykon je tretinovy.
Profilingem zjisteno, ze python je sice pomalejsi jazyk, ale ze jeho knihovny pro práci se stdio a JSON jsou mnohem rychlejsi, zrejme psane v C.
A ja se obavam, ze moje knihovny hy hyly este horsi, nez ty GOckove.
To mi přijde velmi podezřelé.
Co se týče stdin, tak tuším, že v pythonu je ve výchozím stavu bufferovaný, v golang ne. Jinak nevím, v čem by práce se stdin mohla být jiná/více optimální.
Co se týče deserializace jsonu, tak tam můžou být rozdíly velké, i v rámci různých knihoven ve stejném jazyce. Každopádně pořád bych očekával, že optimálnějsí knihovna v golangu bude rychlejší jak optimálnější knihovna v pythonu. Samozřejmě záleží na vstupu - těžko dělat úplně obecné závěry. Nicméně rychlý test mi dává zapravdu (deserializace 1.5e6 menších jsonů):
4.297s python json
1.618s python orjson
2.620s golang json
0.721s golang easyjson
0.393s rust serde_jsonKdyž vezmu standardní knihovny v golangu vs pythonu, je golang rychlejší. Když vezmu optimálnější knihovny třetích stran (easyjson vs orjson), je golang rychlejší. Nicméně pravda - pokud vezmu lepší python knihovnu a standardní golang knihovnu, může být python rychlejší.
Standardní json knihovna v golangu upřednostňuje správnost nad rychlostí - před deserializací a po serializaci provádí ještě zvlášť kontrolu vstupu/výstupu, jestli je validní. Tak kontrola trvá skoro stejně tak dlouho, jako vlastní serializace/deserializace. Čili jenom tím golang ztrácí cca polovinu výkonu. Proto u easyjson pozor na to, že pro nejvyšší výkon je potřeba volat přímo metodu UnmarshalJSON na dané struktuře místo standardní funkce json.Unmarshal (pozn. easyjson generuje kód přímo pro serializaci/deserializaci konkrétních typů).
Pak je ještě možnost napsat to v rustu.
