Skip to content

Commit b118471

Browse files
authored
benchmarks: split benchmarks for avoid depends unnecessary packages (#56)
Signed-off-by: Koichi Shiraishi <zchee.io@gmail.com>
1 parent 38d5924 commit b118471

File tree

6 files changed

+229
-138
lines changed

6 files changed

+229
-138
lines changed

benchmarks/benchmarks_test.go

Lines changed: 184 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,184 @@
1+
/*
2+
* MinIO Cloud Storage, (C) 2022 MinIO, Inc.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package simdjson_benchmarks
18+
19+
import (
20+
"encoding/json"
21+
"io/ioutil"
22+
"path/filepath"
23+
"testing"
24+
25+
"github.com/buger/jsonparser"
26+
jsoniter "github.com/json-iterator/go"
27+
"github.com/klauspost/compress/zstd"
28+
29+
simdjson "github.com/minio/simdjson-go"
30+
)
31+
32+
func benchmarkEncodingJson(b *testing.B, filename string) {
33+
msg := loadCompressed(b, filename)
34+
35+
b.SetBytes(int64(len(msg)))
36+
b.ReportAllocs()
37+
b.ResetTimer()
38+
39+
var parsed interface{}
40+
for i := 0; i < b.N; i++ {
41+
if err := json.Unmarshal(msg, &parsed); err != nil {
42+
b.Fatal(err)
43+
}
44+
}
45+
}
46+
47+
func benchmarkJsoniter(b *testing.B, filename string) {
48+
msg := loadCompressed(b, filename)
49+
50+
b.SetBytes(int64(len(msg)))
51+
b.ReportAllocs()
52+
b.ResetTimer()
53+
54+
var json = jsoniter.ConfigCompatibleWithStandardLibrary
55+
var parsed interface{}
56+
for i := 0; i < b.N; i++ {
57+
if err := json.Unmarshal(msg, &parsed); err != nil {
58+
b.Fatal(err)
59+
}
60+
}
61+
}
62+
63+
func benchmarkSimdJson(b *testing.B, filename string) {
64+
if !simdjson.SupportedCPU() {
65+
b.SkipNow()
66+
}
67+
68+
msg := loadCompressed(b, filename)
69+
70+
b.SetBytes(int64(len(msg)))
71+
b.ReportAllocs()
72+
b.ResetTimer()
73+
74+
pj := &simdjson.ParsedJson{}
75+
for i := 0; i < b.N; i++ {
76+
// Reset tape
77+
var err error
78+
pj, err = simdjson.Parse(msg, pj, simdjson.WithCopyStrings(false))
79+
if err != nil {
80+
b.Fatal(err)
81+
}
82+
}
83+
}
84+
85+
func BenchmarkEncodingJsonApache_builds(b *testing.B) { benchmarkEncodingJson(b, "apache_builds") }
86+
func BenchmarkEncodingJsonCanada(b *testing.B) { benchmarkEncodingJson(b, "canada") }
87+
func BenchmarkEncodingJsonCitm_catalog(b *testing.B) { benchmarkEncodingJson(b, "citm_catalog") }
88+
func BenchmarkEncodingJsonGithub_events(b *testing.B) { benchmarkEncodingJson(b, "github_events") }
89+
func BenchmarkEncodingJsonGsoc_2018(b *testing.B) { benchmarkEncodingJson(b, "gsoc-2018") }
90+
func BenchmarkEncodingJsonInstruments(b *testing.B) { benchmarkEncodingJson(b, "instruments") }
91+
func BenchmarkEncodingJsonMarine_ik(b *testing.B) { benchmarkEncodingJson(b, "marine_ik") }
92+
func BenchmarkEncodingJsonMesh(b *testing.B) { benchmarkEncodingJson(b, "mesh") }
93+
func BenchmarkEncodingJsonMesh_pretty(b *testing.B) { benchmarkEncodingJson(b, "mesh.pretty") }
94+
func BenchmarkEncodingJsonNumbers(b *testing.B) { benchmarkEncodingJson(b, "numbers") }
95+
func BenchmarkEncodingJsonRandom(b *testing.B) { benchmarkEncodingJson(b, "random") }
96+
func BenchmarkEncodingJsonTwitter(b *testing.B) { benchmarkEncodingJson(b, "twitter") }
97+
func BenchmarkEncodingJsonTwitterescaped(b *testing.B) { benchmarkEncodingJson(b, "twitterescaped") }
98+
func BenchmarkEncodingJsonUpdate_center(b *testing.B) { benchmarkEncodingJson(b, "update-center") }
99+
100+
func BenchmarkJsoniterApache_builds(b *testing.B) { benchmarkJsoniter(b, "apache_builds") }
101+
func BenchmarkJsoniterCanada(b *testing.B) { benchmarkJsoniter(b, "canada") }
102+
func BenchmarkJsoniterCitm_catalog(b *testing.B) { benchmarkJsoniter(b, "citm_catalog") }
103+
func BenchmarkJsoniterGithub_events(b *testing.B) { benchmarkJsoniter(b, "github_events") }
104+
func BenchmarkJsoniterGsoc_2018(b *testing.B) { benchmarkJsoniter(b, "gsoc-2018") }
105+
func BenchmarkJsoniterInstruments(b *testing.B) { benchmarkJsoniter(b, "instruments") }
106+
func BenchmarkJsoniterMarine_ik(b *testing.B) { benchmarkJsoniter(b, "marine_ik") }
107+
func BenchmarkJsoniterMesh(b *testing.B) { benchmarkJsoniter(b, "mesh") }
108+
func BenchmarkJsoniterMesh_pretty(b *testing.B) { benchmarkJsoniter(b, "mesh.pretty") }
109+
func BenchmarkJsoniterNumbers(b *testing.B) { benchmarkJsoniter(b, "numbers") }
110+
func BenchmarkJsoniterRandom(b *testing.B) { benchmarkJsoniter(b, "random") }
111+
func BenchmarkJsoniterTwitter(b *testing.B) { benchmarkJsoniter(b, "twitter") }
112+
func BenchmarkJsoniterTwitterescaped(b *testing.B) { benchmarkJsoniter(b, "twitterescaped") }
113+
func BenchmarkJsoniterUpdate_center(b *testing.B) { benchmarkJsoniter(b, "update-center") }
114+
115+
func BenchmarkSimdJsonApache_builds(b *testing.B) { benchmarkSimdJson(b, "apache_builds") }
116+
func BenchmarkSimdJsonCanada(b *testing.B) { benchmarkSimdJson(b, "canada") }
117+
func BenchmarkSimdJsonCitm_catalog(b *testing.B) { benchmarkSimdJson(b, "citm_catalog") }
118+
func BenchmarkSimdJsonGithub_events(b *testing.B) { benchmarkSimdJson(b, "github_events") }
119+
func BenchmarkSimdJsonGsoc_2018(b *testing.B) { benchmarkSimdJson(b, "gsoc-2018") }
120+
func BenchmarkSimdJsonInstruments(b *testing.B) { benchmarkSimdJson(b, "instruments") }
121+
func BenchmarkSimdJsonMarine_ik(b *testing.B) { benchmarkSimdJson(b, "marine_ik") }
122+
func BenchmarkSimdJsonMesh(b *testing.B) { benchmarkSimdJson(b, "mesh") }
123+
func BenchmarkSimdJsonMesh_pretty(b *testing.B) { benchmarkSimdJson(b, "mesh.pretty") }
124+
func BenchmarkSimdJsonNumbers(b *testing.B) { benchmarkSimdJson(b, "numbers") }
125+
func BenchmarkSimdJsonRandom(b *testing.B) { benchmarkSimdJson(b, "random") }
126+
func BenchmarkSimdJsonTwitter(b *testing.B) { benchmarkSimdJson(b, "twitter") }
127+
func BenchmarkSimdJsonTwitterEscaped(b *testing.B) { benchmarkSimdJson(b, "twitterescaped") }
128+
func BenchmarkSimdJsonUpdate_center(b *testing.B) { benchmarkSimdJson(b, "update-center") }
129+
130+
func BenchmarkBugerJsonParserLarge(b *testing.B) {
131+
largeFixture := loadCompressed(b, "payload-large")
132+
const logVals = false
133+
b.SetBytes(int64(len(largeFixture)))
134+
b.ReportAllocs()
135+
b.ResetTimer()
136+
var dump int
137+
for i := 0; i < b.N; i++ {
138+
jsonparser.ArrayEach(largeFixture, func(value []byte, dataType jsonparser.ValueType, offset int, err error) {
139+
sval, _, _, _ := jsonparser.Get(value, "username")
140+
if logVals && i == 0 {
141+
b.Log(string(sval))
142+
}
143+
dump += len(sval)
144+
}, "users")
145+
146+
jsonparser.ArrayEach(largeFixture, func(value []byte, dataType jsonparser.ValueType, offset int, err error) {
147+
ival, _ := jsonparser.GetInt(value, "id")
148+
if logVals && i == 0 {
149+
b.Log(ival)
150+
}
151+
dump += int(ival)
152+
sval, _, _, _ := jsonparser.Get(value, "slug")
153+
if logVals && i == 0 {
154+
b.Log(string(sval))
155+
}
156+
dump += len(sval)
157+
}, "topics", "topics")
158+
}
159+
if dump == 0 {
160+
b.Log("")
161+
}
162+
}
163+
164+
// tester and loadCompressed should be kept in sync with minio/simdjson-go/parsed_json_test.go.
165+
type tester interface {
166+
Fatal(args ...interface{})
167+
}
168+
169+
func loadCompressed(t tester, file string) (ref []byte) {
170+
dec, err := zstd.NewReader(nil)
171+
if err != nil {
172+
t.Fatal(err)
173+
}
174+
ref, err = ioutil.ReadFile(filepath.Join("../", "testdata", file+".json.zst"))
175+
if err != nil {
176+
t.Fatal(err)
177+
}
178+
ref, err = dec.DecodeAll(ref, nil)
179+
if err != nil {
180+
t.Fatal(err)
181+
}
182+
183+
return ref
184+
}

benchmarks/go.mod

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
module github.com/minio/simdjson-go/benchmarks
2+
3+
go 1.17
4+
5+
require (
6+
github.com/buger/jsonparser v1.1.1
7+
github.com/json-iterator/go v1.1.12
8+
github.com/klauspost/compress v1.14.2
9+
github.com/minio/simdjson-go v0.0.0-00010101000000-000000000000
10+
)
11+
12+
replace github.com/minio/simdjson-go => ../
13+
14+
require (
15+
github.com/klauspost/cpuid/v2 v2.0.9 // indirect
16+
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect
17+
github.com/modern-go/reflect2 v1.0.2 // indirect
18+
)

benchmarks/go.sum

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs=
2+
github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0=
3+
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
4+
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
5+
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
6+
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
7+
github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
8+
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
9+
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
10+
github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
11+
github.com/klauspost/compress v1.14.2 h1:S0OHlFk/Gbon/yauFJ4FfJJF5V0fc5HbBTJazi28pRw=
12+
github.com/klauspost/compress v1.14.2/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
13+
github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4=
14+
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
15+
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=
16+
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
17+
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
18+
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
19+
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
20+
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
21+
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
22+
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
23+
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
24+
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=

benchmarks_test.go

Lines changed: 3 additions & 119 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,7 @@
1717
package simdjson
1818

1919
import (
20-
"encoding/json"
2120
"testing"
22-
23-
"github.com/buger/jsonparser"
24-
jsoniter "github.com/json-iterator/go"
2521
)
2622

2723
func benchmarkFromFile(b *testing.B, filename string) {
@@ -77,87 +73,9 @@ func benchmarkFromFile(b *testing.B, filename string) {
7773

7874
}
7975

80-
func BenchmarkParseSmall(b *testing.B) { benchmarkFromFile(b, "payload-small") }
81-
func BenchmarkParseMedium(b *testing.B) { benchmarkFromFile(b, "payload-medium") }
82-
func BenchmarkParseLarge(b *testing.B) { benchmarkFromFile(b, "payload-large") }
83-
func BenchmarkParseApache_builds(b *testing.B) { benchmarkFromFile(b, "apache_builds") }
84-
func BenchmarkParseCanada(b *testing.B) { benchmarkFromFile(b, "canada") }
85-
func BenchmarkParseCitm_catalog(b *testing.B) { benchmarkFromFile(b, "citm_catalog") }
86-
func BenchmarkParseGithub_events(b *testing.B) { benchmarkFromFile(b, "github_events") }
87-
func BenchmarkParseGsoc_2018(b *testing.B) { benchmarkFromFile(b, "gsoc-2018") }
88-
func BenchmarkParseInstruments(b *testing.B) { benchmarkFromFile(b, "instruments") }
89-
func BenchmarkParseMarine_ik(b *testing.B) { benchmarkFromFile(b, "marine_ik") }
90-
func BenchmarkParseMesh(b *testing.B) { benchmarkFromFile(b, "mesh") }
91-
func BenchmarkParseMesh_pretty(b *testing.B) { benchmarkFromFile(b, "mesh.pretty") }
92-
func BenchmarkParseNumbers(b *testing.B) { benchmarkFromFile(b, "numbers") }
93-
func BenchmarkParseRandom(b *testing.B) { benchmarkFromFile(b, "random") }
94-
func BenchmarkParseTwitter(b *testing.B) { benchmarkFromFile(b, "twitter") }
95-
func BenchmarkParseTwitterEscaped(b *testing.B) { benchmarkFromFile(b, "twitterescaped") }
96-
func BenchmarkParseUpdate_center(b *testing.B) { benchmarkFromFile(b, "update-center") }
97-
98-
func benchmarkJsoniter(b *testing.B, filename string) {
99-
100-
msg := loadCompressed(b, filename)
101-
102-
b.SetBytes(int64(len(msg)))
103-
b.ReportAllocs()
104-
b.ResetTimer()
105-
106-
var json = jsoniter.ConfigCompatibleWithStandardLibrary
107-
var parsed interface{}
108-
for i := 0; i < b.N; i++ {
109-
if err := json.Unmarshal(msg, &parsed); err != nil {
110-
b.Fatal(err)
111-
}
112-
}
113-
}
114-
115-
func benchmarkEncodingJson(b *testing.B, filename string) {
116-
117-
msg := loadCompressed(b, filename)
118-
119-
b.SetBytes(int64(len(msg)))
120-
b.ReportAllocs()
121-
b.ResetTimer()
122-
123-
var parsed interface{}
124-
for i := 0; i < b.N; i++ {
125-
126-
if err := json.Unmarshal(msg, &parsed); err != nil {
127-
b.Fatal(err)
128-
}
129-
}
130-
}
131-
132-
func BenchmarkEncodingJsonApache_builds(b *testing.B) { benchmarkEncodingJson(b, "apache_builds") }
133-
func BenchmarkEncodingJsonCanada(b *testing.B) { benchmarkEncodingJson(b, "canada") }
134-
func BenchmarkEncodingJsonCitm_catalog(b *testing.B) { benchmarkEncodingJson(b, "citm_catalog") }
135-
func BenchmarkEncodingJsonGithub_events(b *testing.B) { benchmarkEncodingJson(b, "github_events") }
136-
func BenchmarkEncodingJsonGsoc_2018(b *testing.B) { benchmarkEncodingJson(b, "gsoc-2018") }
137-
func BenchmarkEncodingJsonInstruments(b *testing.B) { benchmarkEncodingJson(b, "instruments") }
138-
func BenchmarkEncodingJsonMarine_ik(b *testing.B) { benchmarkEncodingJson(b, "marine_ik") }
139-
func BenchmarkEncodingJsonMesh(b *testing.B) { benchmarkEncodingJson(b, "mesh") }
140-
func BenchmarkEncodingJsonMesh_pretty(b *testing.B) { benchmarkEncodingJson(b, "mesh.pretty") }
141-
func BenchmarkEncodingJsonNumbers(b *testing.B) { benchmarkEncodingJson(b, "numbers") }
142-
func BenchmarkEncodingJsonRandom(b *testing.B) { benchmarkEncodingJson(b, "random") }
143-
func BenchmarkEncodingJsonTwitter(b *testing.B) { benchmarkEncodingJson(b, "twitter") }
144-
func BenchmarkEncodingJsonTwitterescaped(b *testing.B) { benchmarkEncodingJson(b, "twitterescaped") }
145-
func BenchmarkEncodingJsonUpdate_center(b *testing.B) { benchmarkEncodingJson(b, "update-center") }
146-
147-
func BenchmarkJsoniterApache_builds(b *testing.B) { benchmarkJsoniter(b, "apache_builds") }
148-
func BenchmarkJsoniterCanada(b *testing.B) { benchmarkJsoniter(b, "canada") }
149-
func BenchmarkJsoniterCitm_catalog(b *testing.B) { benchmarkJsoniter(b, "citm_catalog") }
150-
func BenchmarkJsoniterGithub_events(b *testing.B) { benchmarkJsoniter(b, "github_events") }
151-
func BenchmarkJsoniterGsoc_2018(b *testing.B) { benchmarkJsoniter(b, "gsoc-2018") }
152-
func BenchmarkJsoniterInstruments(b *testing.B) { benchmarkJsoniter(b, "instruments") }
153-
func BenchmarkJsoniterMarine_ik(b *testing.B) { benchmarkJsoniter(b, "marine_ik") }
154-
func BenchmarkJsoniterMesh(b *testing.B) { benchmarkJsoniter(b, "mesh") }
155-
func BenchmarkJsoniterMesh_pretty(b *testing.B) { benchmarkJsoniter(b, "mesh.pretty") }
156-
func BenchmarkJsoniterNumbers(b *testing.B) { benchmarkJsoniter(b, "numbers") }
157-
func BenchmarkJsoniterRandom(b *testing.B) { benchmarkJsoniter(b, "random") }
158-
func BenchmarkJsoniterTwitter(b *testing.B) { benchmarkJsoniter(b, "twitter") }
159-
func BenchmarkJsoniterTwitterescaped(b *testing.B) { benchmarkJsoniter(b, "twitterescaped") }
160-
func BenchmarkJsoniterUpdate_center(b *testing.B) { benchmarkJsoniter(b, "update-center") }
76+
func BenchmarkParseSmall(b *testing.B) { benchmarkFromFile(b, "payload-small") }
77+
func BenchmarkParseMedium(b *testing.B) { benchmarkFromFile(b, "payload-medium") }
78+
func BenchmarkParseLarge(b *testing.B) { benchmarkFromFile(b, "payload-large") }
16179

16280
func BenchmarkJsonParserLarge(b *testing.B) {
16381
largeFixture := loadCompressed(b, "payload-large")
@@ -247,37 +165,3 @@ func BenchmarkJsonParserLarge(b *testing.B) {
247165
}
248166
})
249167
}
250-
251-
func BenchmarkBugerJsonParserLarge(b *testing.B) {
252-
largeFixture := loadCompressed(b, "payload-large")
253-
const logVals = false
254-
b.SetBytes(int64(len(largeFixture)))
255-
b.ReportAllocs()
256-
b.ResetTimer()
257-
var dump int
258-
for i := 0; i < b.N; i++ {
259-
jsonparser.ArrayEach(largeFixture, func(value []byte, dataType jsonparser.ValueType, offset int, err error) {
260-
sval, _, _, _ := jsonparser.Get(value, "username")
261-
if logVals && i == 0 {
262-
b.Log(string(sval))
263-
}
264-
dump += len(sval)
265-
}, "users")
266-
267-
jsonparser.ArrayEach(largeFixture, func(value []byte, dataType jsonparser.ValueType, offset int, err error) {
268-
ival, _ := jsonparser.GetInt(value, "id")
269-
if logVals && i == 0 {
270-
b.Log(ival)
271-
}
272-
dump += int(ival)
273-
sval, _, _, _ := jsonparser.Get(value, "slug")
274-
if logVals && i == 0 {
275-
b.Log(string(sval))
276-
}
277-
dump += len(sval)
278-
}, "topics", "topics")
279-
}
280-
if dump == 0 {
281-
b.Log("")
282-
}
283-
}

go.mod

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@ module github.com/minio/simdjson-go
33
go 1.15
44

55
require (
6-
github.com/buger/jsonparser v1.1.1
7-
github.com/json-iterator/go v1.1.9
86
github.com/klauspost/compress v1.13.6
97
github.com/klauspost/cpuid/v2 v2.0.9
108
)

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy