]> Cypherpunks repositories - gostls13.git/commit
big.nat: Improved speed of nat-to-string conversion
authorMichael T. Jones <mtj@google.com>
Tue, 7 Jun 2011 23:02:34 +0000 (16:02 -0700)
committerRobert Griesemer <gri@golang.org>
Tue, 7 Jun 2011 23:02:34 +0000 (16:02 -0700)
commitd5c45c541d71af0ead44a46eca9e38272481d5bb
tree4d402c75d40de73829c14e46f86ea2f06a23b3b2
parentc5281d7ab98996a75eabfd2e6a4075986f93f29a
big.nat: Improved speed of nat-to-string conversion

Three optimizations: First, special-case power of two bases
that partion a Word(), bases 2, 4, 16, and 256. These can
be moved directly from internal Word() storage to the output
without multiprecision operations. Next, same approach for
the other power-of-two bases, 8, 32, 64, and 128. These
don't fill a Word() evenly, so special handling is needed
for those cases where input spans the high-bits of one Word
and the low bis of the next one.  Finally, implement the
general case for others bases in 2 <= base <= 256 using
superbases, the largest power of base representable in a
Word(). For base ten, this is 9 digits and a superbase of
10^9 for 32-bit Words and 19 digits and 10^19 for 64-bit
compiles. This way we do just 1/9th or 1/19th of the expensive
multiprecision divisions, unpacking superdigits using fast
native machine arithmetic. The resulting code runs 7x to
800x the speed of the previous approach, depending on the
length of the number to be converted--longer is relatively
faster.

Also, extended the tests and benchmarks for string to nat
(scan()) and nat to string (string()) functions. A further
enhancement awaits the next CL to make general cases about
7x faster for long cases.

R=gri
CC=golang-dev
https://golang.org/cl/4595041
src/pkg/big/nat.go
src/pkg/big/nat_test.go