3-6x faster than
time, see Benchmarks
Go port of A Very Fast 64–Bit Date Algorithm, based on A Very Fast 64–Bit Date Algorithm: 30–40% faster by Ben Joffe. Also uses Parts of The Julian Map: A Faster technique for Gregorian Date Conversion, see Improvements to the Inverse Function. Special thanks to @benjoffe for writing such easy to follow blog posts and implementations.
go get github.com/xnacly/go-fast-datepackage main
import (
"fmt"
"time"
"github.com/xnacly/go-fast-date"
)
func main() {
date := gofastdate.FromUnix(time.Now().Unix())
fmt.Println(date)
fmt.Println(date.Time())
fmt.Println(date.Unix(), date.Time().Unix())
}go-fast-date implements Ben Joffe's very fast 64-bit date
algorithm and provides date round trip functions for
time.Time compatibility:
gofastdate.FromUnixgofastdate.FromTimegofastdate.Date.Timegofastdate.Date.Unix
While not depending on any dependency and striving to match Joffe's implementation, where applicable.
| kind | benchmark | time |
go-fast-date |
speedup | runtime reduction |
|---|---|---|---|---|---|
| micro | BenchmarkDateToUnix | 194.6 ns/op | 63.59 ns/op | 3.06x | −67.3% |
| BenchmarkUnixToDate | 582.9 ns/op | 90.23 ns/op | 6.46x | −84.5% | |
| stress | BenchmarkStressDateToUnix | 8.697 ms/op | 2.856 ms/op | 3.05x | −67.2% |
| BenchmarkStressUnixToDate | 27.316 ms/op | 4.286 ms/op | 6.37x | −84.3% |
Benchmarks focus on comparing gofastdate.FromUnix with
time.Unix. Run with go test ./... -bench=.
goos: linux
goarch: amd64
pkg: github.com/xnacly/go-fast-date
cpu: AMD Ryzen 7 PRO 7840U w/ Radeon 780M Graphics
BenchmarkTimeDateToUnix-16 6215389 194.6 ns/op 0 B/op 0 allocs/op
BenchmarkGoFastDateToUnix-16 18198014 63.59 ns/op 0 B/op 0 allocs/op
BenchmarkTimeUnixToDate-16 2046949 582.9 ns/op 0 B/op 0 allocs/op
BenchmarkGoFastDateFromUnix-16 12165228 90.23 ns/op 0 B/op 0 allocs/op
BenchmarkStressTimeDateToUnix-16 135 8696891 ns/op 0 B/op 0 allocs/op
BenchmarkStressGoFastDateToUnix-16 391 2855936 ns/op 0 B/op 0 allocs/op
BenchmarkStressTimeUnixToDate-16 37 27315987 ns/op 0 B/op 0 allocs/op
BenchmarkStressGoFastDateFromUnix-16 282 4285671 ns/op 0 B/op 0 allocs/op
PASS
ok github.com/xnacly/go-fast-date 13.927s