Golang - SIMD substring search

petersveter

Golang - SIMD substring search
« kdy: 11. 02. 2024, 15:15:10 »
Mam kniznicu ktora ocistuje JSON od null hodnot. Preco, je irelevantne.

Jedna sa o jednoduche vyhladavanie s bytes.Index(). Originalne pouzivam goccy json lebo je najrychlejsi Go json serializer ale ocistit nullove hodnoty mi pridava 55% casu nad goccy, i ked dokopy je to stale 10% rychlejsie nez nativny go json serializer.

Benchoval som rozne postupy ale nativny bytes.Index() bol vzdy najrychlejsi, nech som robil co som chcel. Bolo mi poradene skusit SIMD pristup, hlavne ked hladam staticky retazec kde viem presne znaky a dlzku ktore sa nikdy nemenia, cim sa da kod optimalizovat, no nikdy som s tym nerobil. Viem cca o co ide ale to mi je aj tak na nic ked s tym realne neviem robit.

Zaujimalo by ma ci niekto nevie ako na to teda? Cital som ze takto funguje simdjson, co je Cckovy projekt ale. Principialne ide o to co najrychlejsie najst index kde je "null" v bytovom poli a nasledne najst pociatocny a konecny index retazca ktory sa ma odmazat a takto prejst cely json.


alex6bbc

  • *****
  • 1 672
    • Zobrazit profil
    • E-mail
Re:Golang - SIMD substring search
« Odpověď #1 kdy: 11. 02. 2024, 16:08:07 »
simd package vyuziva simd instrukce, v rychlosti jsem koukal co tam je za funkce a treba FirstLeq8 vyhledava pozici nejake bytove hodnoty (ve vasem pripade 0) v poli bytu.

Re:Golang - SIMD substring search
« Odpověď #2 kdy: 12. 02. 2024, 09:54:18 »
simdjson má go port: https://github.com/minio/simdjson-go

popř. si můžeš napsat optimalizovanou funkci přímo v tom hnusném go assembleru :)

alex6bbc

  • *****
  • 1 672
    • Zobrazit profil
    • E-mail
Re:Golang - SIMD substring search
« Odpověď #3 kdy: 12. 02. 2024, 10:58:27 »
a nebo to nedelat simd, ale pomoci gorutin. rozsekat json na kusy, poslat kusy do gorutin a na konci zas slozit upraveny json.

RDa

  • *****
  • 2 739
    • Zobrazit profil
    • E-mail
Re:Golang - SIMD substring search
« Odpověď #4 kdy: 12. 02. 2024, 15:10:42 »
Taky bych to resil v textove domene, pred parsovanim.

Ale dropnout nulls me prijde jako zajimava featura - nema treba nektery parser nejakou takovou optionu kdyz soubor nacitavate?


petersveter

Re:Golang - SIMD substring search
« Odpověď #5 kdy: 12. 02. 2024, 17:55:45 »
simdjson má go port: https://github.com/minio/simdjson-go

popř. si můžeš napsat optimalizovanou funkci přímo v tom hnusném go assembleru :)

Ano ved o to mi ide len vobec neviem ako na to.

tecka

  • ***
  • 159
    • Zobrazit profil
    • E-mail
Re:Golang - SIMD substring search
« Odpověď #6 kdy: 12. 02. 2024, 19:13:31 »
Jakože hledáš "null" a pak kontroluješ, jestli je to skutečně hodnota null nebo třeba součást stringu? A jestli je v poli, nebo s klíčem v objektu a tak? To nevypadá, že to co potřebuješ řešit je to prvotní vyhledání null  :)

alex6bbc

  • *****
  • 1 672
    • Zobrazit profil
    • E-mail
Re:Golang - SIMD substring search
« Odpověď #7 kdy: 12. 02. 2024, 19:25:53 »
Jakože hledáš "null" a pak kontroluješ, jestli je to skutečně hodnota null nebo třeba součást stringu? A jestli je v poli, nebo s klíčem v objektu a tak? To nevypadá, že to co potřebuješ řešit je to prvotní vyhledání null  :)

ja bych hledal null a pak bych hledal v okoli pro uvozovky, dvojtecky apod.

Re:Golang - SIMD substring search
« Odpověď #8 kdy: 12. 02. 2024, 19:52:46 »
Tak já předpokládám, že právě gorutiny už používá a pořád to chce zrychlit.

Ten simdjson je dobrý projekt ke studii, protože právě pozná co je string a co ne, takže ho použít jenom k tomu stripnout ty null hodnoty by bylo asi to nejefektivnější řešení.

mikrom

  • ****
  • 370
    • Zobrazit profil
    • E-mail
Re:Golang - SIMD substring search
« Odpověď #9 kdy: 12. 02. 2024, 20:20:23 »
ja by som na ocistenie JSON od null pouzil jq