README.md (2479B)
1 uint128 2 ------- 3 4 [![GoDoc](https://godoc.org/github.com/lukechampine/uint128?status.svg)](https://godoc.org/github.com/lukechampine/uint128) 5 [![Go Report Card](http://goreportcard.com/badge/github.com/lukechampine/uint128)](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 ```