]> Cypherpunks repositories - gostls13.git/commitdiff
hash/crc64: lazily initialize slice8Tables
authorCholerae Hu <choleraehyq@gmail.com>
Fri, 3 Aug 2018 06:29:37 +0000 (14:29 +0800)
committerBrad Fitzpatrick <bradfitz@golang.org>
Tue, 21 Aug 2018 04:50:21 +0000 (04:50 +0000)
Saves 36KB of memory in stdlib packages.

Updates #26775

Change-Id: I0f9d7b17d9768f6fb980d5fbba7c45920215a5fc
Reviewed-on: https://go-review.googlesource.com/127735
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
src/hash/crc64/crc64.go

index a799a017c938cad6f1a58fad6aea0e706af70527..063c63c6a3b092eee809334822e316c14b79e466 100644 (file)
@@ -10,6 +10,7 @@ package crc64
 import (
        "errors"
        "hash"
+       "sync"
 )
 
 // The size of a CRC-64 checksum in bytes.
@@ -28,13 +29,24 @@ const (
 type Table [256]uint64
 
 var (
-       slicing8TableISO  = makeSlicingBy8Table(makeTable(ISO))
-       slicing8TableECMA = makeSlicingBy8Table(makeTable(ECMA))
+       slicing8TablesBuildOnce sync.Once
+       slicing8TableISO        *[8]Table
+       slicing8TableECMA       *[8]Table
 )
 
+func buildSlicing8TablesOnce() {
+       slicing8TablesBuildOnce.Do(buildSlicing8Tables)
+}
+
+func buildSlicing8Tables() {
+       slicing8TableISO = makeSlicingBy8Table(makeTable(ISO))
+       slicing8TableECMA = makeSlicingBy8Table(makeTable(ECMA))
+}
+
 // MakeTable returns a Table constructed from the specified polynomial.
 // The contents of this Table must not be modified.
 func MakeTable(poly uint64) *Table {
+       buildSlicing8TablesOnce()
        switch poly {
        case ISO:
                return &slicing8TableISO[0]
@@ -141,6 +153,7 @@ func readUint64(b []byte) uint64 {
 }
 
 func update(crc uint64, tab *Table, p []byte) uint64 {
+       buildSlicing8TablesOnce()
        crc = ^crc
        // Table comparison is somewhat expensive, so avoid it for small sizes
        for len(p) >= 64 {