auth/vendor/lukechampine.com/uint128
Maxim Lebedev e7a128d69e
:pin: Upgraded and vendored go modules
2023-03-16 21:02:14 +06:00
..
LICENSE 📌 Vendored dependencies 2022-06-09 22:35:23 +05:00
README.md 📌 Vendored dependencies 2022-06-09 22:35:23 +05:00
uint128.go :pin: Upgraded and vendored go modules 2023-03-16 21:02:14 +06:00

README.md

uint128

GoDoc
Go Report Card

go get lukechampine.com/uint128

uint128 provides a high-performance Uint128 type that supports standard arithmetic
operations. Unlike math/big, operations on Uint128 values always produce new values
instead of modifying a pointer receiver. A Uint128 value is therefore immutable, just
like uint64 and friends.

The name uint128.Uint128 stutters, so I recommend either using a "dot import"
or aliasing uint128.Uint128 to give it a project-specific name. Embedding the type
is not recommended, because methods will still return uint128.Uint128; this means that,
if you want to extend the type with new methods, your best bet is probably to copy the
source code wholesale and rename the identifier. ¯\_(ツ)_/¯

Benchmarks

Addition, multiplication, and subtraction are on par with their native 64-bit
equivalents. Division is slower: ~20x slower when dividing a Uint128 by a
uint64, and ~100x slower when dividing by a Uint128. However, division is
still faster than with big.Int (for the same operands), especially when
dividing by a uint64.

BenchmarkArithmetic/Add-4              2000000000    0.45 ns/op    0 B/op      0 allocs/op
BenchmarkArithmetic/Sub-4              2000000000    0.67 ns/op    0 B/op      0 allocs/op
BenchmarkArithmetic/Mul-4              2000000000    0.42 ns/op    0 B/op      0 allocs/op
BenchmarkArithmetic/Lsh-4              2000000000    1.06 ns/op    0 B/op      0 allocs/op
BenchmarkArithmetic/Rsh-4              2000000000    1.06 ns/op    0 B/op      0 allocs/op

BenchmarkDivision/native_64/64-4       2000000000    0.39 ns/op    0 B/op      0 allocs/op
BenchmarkDivision/Div_128/64-4         2000000000    6.28 ns/op    0 B/op      0 allocs/op
BenchmarkDivision/Div_128/128-4        30000000      45.2 ns/op    0 B/op      0 allocs/op
BenchmarkDivision/big.Int_128/64-4     20000000      98.2 ns/op    8 B/op      1 allocs/op
BenchmarkDivision/big.Int_128/128-4    30000000      53.4 ns/op    48 B/op     1 allocs/op

BenchmarkString/Uint128-4              10000000      173 ns/op     48 B/op     1 allocs/op
BenchmarkString/big.Int-4              5000000       350 ns/op     144 B/op    3 allocs/op