perf: outline logic in Decode to allow for stack allocations#174
Merged
perf: outline logic in Decode to allow for stack allocations#174
Conversation
4 tasks
c05eb6e to
4194c21
Compare
I took extra efforts for this to be a backward compatible change, I think `DecodedMultihash` should return a value struct not a pointer. I also updated the error type to a value because this allows for 1 instead of 2 allocations when erroring. ``` name old time/op new time/op delta Decode-12 102ns ± 3% 18ns ± 3% -82.47% (p=0.000 n=9+9) name old alloc/op new alloc/op delta Decode-12 64.0B ± 0% 0.0B -100.00% (p=0.000 n=10+10) name old allocs/op new allocs/op delta Decode-12 1.00 ± 0% 0.00 -100.00% (p=0.000 n=10+10) ``` I originally found this problem by benchmarking `go-cid`: ``` github.com/ipfs/go-cid.CidFromBytes /home/hugo/go/pkg/mod/github.com/ipfs/[email protected]/cid.go Total: 4.64GB 10.75GB (flat, cum) 100% 638 . . if len(data) > 2 && data[0] == mh.SHA2_256 && data[1] == 32 { 639 . . if len(data) < 34 { 640 . . return 0, Undef, ErrInvalidCid{fmt.Errorf("not enough bytes for cid v0")} 641 . . } 642 . . 643 . 6.11GB h, err := mh.Cast(data[:34]) _, err := Decode(buf) multihash.go:215 644 . . if err != nil { 645 . . return 0, Undef, ErrInvalidCid{err} 646 . . } ``` We can see it call `mh.Cast` and `mh.Cast` call `Decode` and instantly drops the `DecodedMultihash`. The point of this is purely to validate the multihash by checking err.
|
Suggested version: Changes in (empty)
Cutting a Release (and modifying non-markdown files)This PR is modifying both Automatically created GitHub ReleaseA draft GitHub Release has been created. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
I took extra efforts for this to be a backward compatible change, I think
DecodedMultihashshould return a value struct not a pointer.I also updated the error type to a value because this allows for 1 instead of 2 allocations when erroring.
I originally found this problem by benchmarking
go-cid:We can see it call
mh.Castandmh.CastcallDecodeand instantly drops theDecodedMultihash. The point of this is purely to validate the multihash.