golang/go
View on GitHubstrings/bytes: LastIndexByte is significantly slower than IndexByte
Open
#36,891 opened on Jan 30, 2020
NeedsFixPerformancehelp wanted
Repository metrics
- Stars
- (133,883 stars)
- PR merge metrics
- (No merged PRs in 30d)
Description
What version of Go are you using (go version)?
Does this issue reproduce with the latest release?
yes.
What operating system and processor architecture are you using (go env)?
Both Linux/MacOS
What did you do?
I was using multipart.NewReader() to process multi-part responses from Cloud REST API. It turned out that ~1/3 of profile is spent in mime/multipart/multipart.go :: scanUntilBoundary() -> bytes.LastIndexByte().
After looking into it, it is no wonder as bytes.LastIndexByte() is not using any optimisations and compiled into simple loop iterating over bytes, no REP SCASB instruction is used on Intel (nor SSE).
What did you expect to see?
bytes.LastIndexByte() to use SSE or at least REP SCASB optimised code.
What did you see instead?
simple byte to byte loop in asm code.