]> Cypherpunks repositories - gostls13.git/commitdiff
encoding/base64, encoding/base32: make DecodeString faster
authorRui Ueyama <ruiu@google.com>
Wed, 11 Jun 2014 18:22:08 +0000 (11:22 -0700)
committerBrad Fitzpatrick <bradfitz@golang.org>
Wed, 11 Jun 2014 18:22:08 +0000 (11:22 -0700)
Previously, an input string was stripped of newline
characters at the beginning of DecodeString and then passed
to Decode. Decode again tried to strip newline characters.
That's waste of time.

benchmark                 old MB/s     new MB/s  speedup
BenchmarkDecodeString        38.37        65.20    1.70x

LGTM=dave, bradfitz
R=golang-codereviews, dave, bradfitz
CC=golang-codereviews
https://golang.org/cl/91770051

src/pkg/encoding/base32/base32.go
src/pkg/encoding/base64/base64.go
src/pkg/encoding/base64/base64_test.go

index d770de3915fb09df4ca74e7895c864b6444380e7..7613de24d275590025e3e8fd81fb1fcd7dff2ad6 100644 (file)
@@ -330,7 +330,7 @@ func (enc *Encoding) Decode(dst, src []byte) (n int, err error) {
 func (enc *Encoding) DecodeString(s string) ([]byte, error) {
        s = strings.Map(removeNewlinesMapper, s)
        dbuf := make([]byte, enc.DecodedLen(len(s)))
-       n, err := enc.Decode(dbuf, []byte(s))
+       n, _, err := enc.decode(dbuf, []byte(s))
        return dbuf[:n], err
 }
 
index e38c26d0ec73cc508306f8e200de26173b9e849f..4f1fcad9176c9d51b2ab48220a7400c4bbc013de 100644 (file)
@@ -295,7 +295,7 @@ func (enc *Encoding) Decode(dst, src []byte) (n int, err error) {
 func (enc *Encoding) DecodeString(s string) ([]byte, error) {
        s = strings.Map(removeNewlinesMapper, s)
        dbuf := make([]byte, enc.DecodedLen(len(s)))
-       n, err := enc.Decode(dbuf, []byte(s))
+       n, _, err := enc.decode(dbuf, []byte(s))
        return dbuf[:n], err
 }
 
index a075194e03ef1345fb1e90bff49813b1ff25ea22..691edb755b647702702dd8011077626644426299 100644 (file)
@@ -342,3 +342,11 @@ func TestDecoderIssue7733(t *testing.T) {
                t.Errorf("DecodeString = %q; want abcd", s)
        }
 }
+
+func BenchmarkDecodeString(b *testing.B) {
+       data := StdEncoding.EncodeToString(make([]byte, 8192))
+       b.SetBytes(int64(len(data)))
+       for i := 0; i < b.N; i++ {
+               StdEncoding.DecodeString(data)
+       }
+}