summaryrefslogtreecommitdiffstats
path: root/client/go/internal
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2023-05-05 03:14:28 +0200
committerGitHub <noreply@github.com>2023-05-05 03:14:28 +0200
commit05e3a68f842cfb708c2f85e3fa5b624517badb0b (patch)
tree4dece61bf0e2f7e3b70e47602225d927679f7dd2 /client/go/internal
parentd02a5d6c62cfe08602c86044da446972150352d9 (diff)
parent6b16115f6f3b973da5c1f50215f07056f45e26fa (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.go3
-rw-r--r--client/go/internal/vespa/document/document_test.go23
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) }