diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2023-05-05 03:14:28 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-05-05 03:14:28 +0200 |
commit | 05e3a68f842cfb708c2f85e3fa5b624517badb0b (patch) | |
tree | 4dece61bf0e2f7e3b70e47602225d927679f7dd2 /client/go/internal | |
parent | d02a5d6c62cfe08602c86044da446972150352d9 (diff) | |
parent | 6b16115f6f3b973da5c1f50215f07056f45e26fa (diff) |
Merge pull request #26976 from vespa-engine/mpolden/faster-json-decoding
Change JSON decoder
Diffstat (limited to 'client/go/internal')
-rw-r--r-- | client/go/internal/vespa/document/document.go | 3 | ||||
-rw-r--r-- | client/go/internal/vespa/document/document_test.go | 23 |
2 files changed, 24 insertions, 2 deletions
diff --git a/client/go/internal/vespa/document/document.go b/client/go/internal/vespa/document/document.go index 214d1dc4797..15cd8c43de5 100644 --- a/client/go/internal/vespa/document/document.go +++ b/client/go/internal/vespa/document/document.go @@ -2,11 +2,12 @@ package document import ( "bufio" - "encoding/json" "fmt" "io" "strconv" "strings" + + "github.com/goccy/go-json" ) var asciiSpace = [256]uint8{'\t': 1, '\n': 1, '\v': 1, '\f': 1, '\r': 1, ' ': 1} diff --git a/client/go/internal/vespa/document/document_test.go b/client/go/internal/vespa/document/document_test.go index 111b9e37acc..bdf18586753 100644 --- a/client/go/internal/vespa/document/document_test.go +++ b/client/go/internal/vespa/document/document_test.go @@ -1,6 +1,7 @@ package document import ( + "fmt" "io" "reflect" "strings" @@ -173,8 +174,28 @@ func TestDocumentDecoder(t *testing.T) { t.Errorf("unexpected error: %s", err) } _, err = r.Decode() - wantErr := "invalid json at byte offset 60: invalid character '\\n' in string literal" + wantErr := "invalid json at byte offset 122: json: string of object unexpected end of JSON input" if err.Error() != wantErr { t.Errorf("want error %q, got %q", wantErr, err.Error()) } } + +func benchmarkDocumentDecoder(b *testing.B, size int) { + b.Helper() + input := fmt.Sprintf(`{"put": "id:ns:type::doc1", "fields": {"foo": "%s"}}`, strings.Repeat("s", size)) + r := strings.NewReader(input) + dec := NewDecoder(r) + b.ResetTimer() // ignore setup time + + for n := 0; n < b.N; n++ { + _, err := dec.Decode() + if err != nil { + b.Fatal(err) + } + r.Seek(0, 0) + } +} + +func BenchmarkDocumentDecoderSmall(b *testing.B) { benchmarkDocumentDecoder(b, 10) } + +func BenchmarkDocumentDecoderLarge(b *testing.B) { benchmarkDocumentDecoder(b, 10000) } |