make simdjson great again.

now it is generally a little faster than the easyjson approach.

goos: linux
goarch: amd64
pkg: github.com/nbd-wtf/go-nostr
cpu: AMD Ryzen 3 3200G with Radeon Vega Graphics
BenchmarkParseMessage/stdlib-4         	      90	  15616341 ns/op
BenchmarkParseMessage/easyjson-4       	     110	  11306466 ns/op
BenchmarkParseMessage/simdjson-4       	     162	   7779856 ns/op
PASS
ok  	github.com/nbd-wtf/go-nostr	5.547s
This commit is contained in:
fiatjaf
2025-03-05 23:42:16 -03:00
parent de358e641c
commit 4fb6fcd9a2
6 changed files with 258 additions and 257 deletions
+14 -11
View File
@@ -17,17 +17,20 @@ var (
attrSearch = []byte("search")
)
func (filter *Filter) UnmarshalSIMD(iter *simdjson.Iter) error {
obj, err := iter.Object(nil)
func (filter *Filter) UnmarshalSIMD(
iter *simdjson.Iter,
obj *simdjson.Object,
arr *simdjson.Array,
) (*simdjson.Object, *simdjson.Array, error) {
obj, err := iter.Object(obj)
if err != nil {
return fmt.Errorf("unexpected at filter: %w", err)
return obj, arr, fmt.Errorf("unexpected at filter: %w", err)
}
var arr *simdjson.Array
for {
name, t, err := obj.NextElementBytes(iter)
if err != nil {
return err
return obj, arr, err
} else if t == simdjson.TypeNone {
break
}
@@ -51,7 +54,7 @@ func (filter *Filter) UnmarshalSIMD(iter *simdjson.Iter) error {
break
}
if kind, err := i.Uint(); err != nil {
return err
return obj, arr, err
} else {
filter.Kinds = append(filter.Kinds, int(kind))
}
@@ -84,24 +87,24 @@ func (filter *Filter) UnmarshalSIMD(iter *simdjson.Iter) error {
arr, err := iter.Array(arr)
if err != nil {
return err
return obj, arr, err
}
vals, err := arr.AsString()
if err != nil {
return err
return obj, arr, err
}
filter.Tags[string(name[1:])] = vals
continue
}
return fmt.Errorf("unexpected filter field '%s'", name)
return obj, arr, fmt.Errorf("unexpected filter field '%s'", name)
}
if err != nil {
return err
return obj, arr, err
}
}
return nil
return obj, arr, nil
}