encoding/binary: use an offset instead of slicing
encoding/binary: use an offset instead of slicing

While running make.bash, over 5% of all pointer writes
come from encoding/binary doing struct reads.

This change replaces slicing during such reads with an offset.
This avoids updating the slice pointer with every
struct field read or write.

This has no impact when the write barrier is off.
Running the benchmarks with GOGC=1, however,
shows significant improvement:

name          old time/op    new time/op    delta
ReadStruct-8    13.2µs ± 6%    10.1µs ± 5%  -23.24%  (p=0.000 n=10+10)

name          old speed      new speed      delta
ReadStruct-8  5.69MB/s ± 6%  7.40MB/s ± 5%  +30.18%  (p=0.000 n=10+10)

Change-Id: I22904263196bfeddc38abe8989428e263aee5253
Reviewed-on: https://go-review.googlesource.com/98757
Run-TryBot: Josh Bleecher Snyder <cdc248cc4d32e4fbfe04e45228163bcecd48a0b9@gmail.com>
TryBot-Result: Gobot Gobot <66cb808b70d30c07676d5e946fee83fd561249e5@golang.org>
Reviewed-by: Ian Lance Taylor <87e9c6d529889242b7e184afb632328636553ab4@golang.org>

codestation/go,cloudflare/go,Cofyc/go,golang/go,CAFxX/go,codestation/go,akutz/go,nawawi/go,josharian/go,cloudflare/go,CAFxX/go,codestation/go,codestation/go,golang/go,josharian/go,golang/go,cloudflare/go,golang/go,akutz/go,akutz/go,akutz/go,akutz/go,CAFxX/go,golang/go,nawawi/go,Cofyc/go,golang/go,CAFxX/go,codestation/go,golang/go,nawawi/go,nawawi/go,akutz/go,cloudflare/go,golang/go,Cofyc/go,Cofyc/go,nawawi/go,akutz/go,nawawi/go,CAFxX/go,cloudflare/go,codestation/go,Cofyc/go,CAFxX/go,nawawi/go,josharian/go,codestation/go,CAFxX/go,josharian/go,CAFxX/go,cloudflare/go,josharian/go,cloudflare/go,josharian/go,Cofyc/go,akutz/go,cloudflare/go,Cofyc/go,codestation/go,nawawi/go,josharian/go,josharian/go,Cofyc/go