diff options
| author | Rose Hogenson <rosehogenson@posteo.net> | 2025-10-30 18:45:11 -0700 |
|---|---|---|
| committer | Rose Hogenson <rosehogenson@posteo.net> | 2025-10-30 18:50:19 -0700 |
| commit | aa8a935f620a053cc9c3c65587b433f3e8d3a6e9 (patch) | |
| tree | a786b3174c1a901f19fc10485c4856d60ef93d6b /ccl.go | |
| parent | Don't allocate an intermediate map[string]any (diff) | |
| download | ccl-aa8a935f620a053cc9c3c65587b433f3e8d3a6e9.tar.zst | |
Use a classic struct iterator instead of iter.Pull
iter.Pull doesn't provide much value here. Actually the lexer is
probably simpler this way, and iter.Pull also destroys stack traces for
panics in the lexer.
Ouch
goos: linux
goarch: amd64
pkg: roseh.moe/pkg/ccl
cpu: AMD Ryzen 9 5900X 12-Core Processor
│ baseline.txt │ itern't.txt │
│ sec/op │ sec/op vs base │
Lex-24 1.436µ ± 0% 1.320µ ± 0% -8.05% (p=0.000 n=20)
Parse-24 7.846µ ± 0% 4.801µ ± 0% -38.82% (p=0.000 n=20)
geomean 3.356µ 2.517µ -24.99%
Diffstat (limited to 'ccl.go')
| -rw-r--r-- | ccl.go | 13 |
1 files changed, 3 insertions, 10 deletions
@@ -164,7 +164,6 @@ import ( "encoding/base64" "errors" "fmt" - "iter" "math" "reflect" "strconv" @@ -243,7 +242,7 @@ func fieldMap(out map[structField]int, types map[reflect.Type]bool, s reflect.Ty } type parser struct { - nextTok func() (token, error, bool) + nextTok func() (token, error) tok []byte err error data []byte @@ -261,11 +260,7 @@ func (p *parser) peek() ([]byte, error) { if p.err != nil || p.tok != nil { return p.tok, p.err } - tok, err, ok := p.nextTok() - if !ok { - p.err = errEOF - return nil, p.err - } + tok, err := p.nextTok() if err != nil { p.err = err return nil, p.err @@ -747,7 +742,5 @@ func Unmarshal(data []byte, v any) error { if err := fieldMap(fields, make(map[reflect.Type]bool), val.Type().Elem()); err != nil { return err } - nextToken, stop := iter.Pull2(tokens(data)) - defer stop() - return (&parser{nextTok: nextToken, data: data, fieldMap: fields}).parse(val.Elem()) + return (&parser{nextTok: newLexer(data).next, data: data, fieldMap: fields}).parse(val.Elem()) } |
