[822] | 1 | uint128
|
---|
| 2 | -------
|
---|
| 3 |
|
---|
| 4 | [](https://godoc.org/github.com/lukechampine/uint128)
|
---|
| 5 | [](https://goreportcard.com/report/github.com/lukechampine/uint128)
|
---|
| 6 |
|
---|
| 7 | ```
|
---|
| 8 | go get lukechampine.com/uint128
|
---|
| 9 | ```
|
---|
| 10 |
|
---|
| 11 | `uint128` provides a high-performance `Uint128` type that supports standard arithmetic
|
---|
| 12 | operations. Unlike `math/big`, operations on `Uint128` values always produce new values
|
---|
| 13 | instead of modifying a pointer receiver. A `Uint128` value is therefore immutable, just
|
---|
| 14 | like `uint64` and friends.
|
---|
| 15 |
|
---|
| 16 | The name `uint128.Uint128` stutters, so I recommend either using a "dot import"
|
---|
| 17 | or aliasing `uint128.Uint128` to give it a project-specific name. Embedding the type
|
---|
| 18 | is not recommended, because methods will still return `uint128.Uint128`; this means that,
|
---|
| 19 | if you want to extend the type with new methods, your best bet is probably to copy the
|
---|
| 20 | source code wholesale and rename the identifier. ¯\\\_(ツ)\_/¯
|
---|
| 21 |
|
---|
| 22 |
|
---|
| 23 | # Benchmarks
|
---|
| 24 |
|
---|
| 25 | Addition, multiplication, and subtraction are on par with their native 64-bit
|
---|
| 26 | equivalents. Division is slower: ~20x slower when dividing a `Uint128` by a
|
---|
| 27 | `uint64`, and ~100x slower when dividing by a `Uint128`. However, division is
|
---|
| 28 | still faster than with `big.Int` (for the same operands), especially when
|
---|
| 29 | dividing by a `uint64`.
|
---|
| 30 |
|
---|
| 31 | ```
|
---|
| 32 | BenchmarkArithmetic/Add-4 2000000000 0.45 ns/op 0 B/op 0 allocs/op
|
---|
| 33 | BenchmarkArithmetic/Sub-4 2000000000 0.67 ns/op 0 B/op 0 allocs/op
|
---|
| 34 | BenchmarkArithmetic/Mul-4 2000000000 0.42 ns/op 0 B/op 0 allocs/op
|
---|
| 35 | BenchmarkArithmetic/Lsh-4 2000000000 1.06 ns/op 0 B/op 0 allocs/op
|
---|
| 36 | BenchmarkArithmetic/Rsh-4 2000000000 1.06 ns/op 0 B/op 0 allocs/op
|
---|
| 37 |
|
---|
| 38 | BenchmarkDivision/native_64/64-4 2000000000 0.39 ns/op 0 B/op 0 allocs/op
|
---|
| 39 | BenchmarkDivision/Div_128/64-4 2000000000 6.28 ns/op 0 B/op 0 allocs/op
|
---|
| 40 | BenchmarkDivision/Div_128/128-4 30000000 45.2 ns/op 0 B/op 0 allocs/op
|
---|
| 41 | BenchmarkDivision/big.Int_128/64-4 20000000 98.2 ns/op 8 B/op 1 allocs/op
|
---|
| 42 | BenchmarkDivision/big.Int_128/128-4 30000000 53.4 ns/op 48 B/op 1 allocs/op
|
---|
| 43 |
|
---|
| 44 | BenchmarkString/Uint128-4 10000000 173 ns/op 48 B/op 1 allocs/op
|
---|
| 45 | BenchmarkString/big.Int-4 5000000 350 ns/op 144 B/op 3 allocs/op
|
---|
| 46 | ```
|
---|