mirror of
https://github.com/golang/go
synced 2024-11-19 09:54:49 -07:00
ea59ebd338
Use the __vdso_clock_gettime fast path via the vDSO on linux/arm64 to speed up nanotime and walltime. This results in the following performance improvement for time.Now on Cavium ThunderX: name old time/op new time/op delta TimeNow 442ns ± 0% 163ns ± 0% -63.16% (p=0.000 n=10+10) And benchmarks on VDSO BenchmarkClockVDSOAndFallbackPaths/vDSO 10000000 166 ns/op BenchmarkClockVDSOAndFallbackPaths/Fallback 3000000 456 ns/op Change-Id: I326118c6dff865eaa0569fc45d1fc1ff95cb74f6 Reviewed-on: https://go-review.googlesource.com/99855 Run-TryBot: Tobias Klauser <tobias.klauser@gmail.com> Run-TryBot: Ian Lance Taylor <iant@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
64 lines
1.6 KiB
Go
64 lines
1.6 KiB
Go
// Copyright 2017 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
// +build linux
|
|
// +build 386 amd64 arm arm64
|
|
|
|
package runtime_test
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
_ "unsafe"
|
|
)
|
|
|
|
// These tests are a little risky because they overwrite the vdsoClockgettimeSym value.
|
|
// It's normally initialized at startup and remains unchanged after that.
|
|
|
|
//go:linkname vdsoClockgettimeSym runtime.vdsoClockgettimeSym
|
|
var vdsoClockgettimeSym uintptr
|
|
|
|
func TestClockVDSOAndFallbackPaths(t *testing.T) {
|
|
// Check that we can call walltime() and nanotime() with and without their (1st) fast-paths.
|
|
// This just checks that fast and fallback paths can be called, rather than testing their
|
|
// results.
|
|
//
|
|
// Call them indirectly via time.Now(), so we don't need auxiliary .s files to allow us to
|
|
// use go:linkname to refer to the functions directly.
|
|
|
|
save := vdsoClockgettimeSym
|
|
if save == 0 {
|
|
t.Log("vdsoClockgettime symbol not found; fallback path will be used by default")
|
|
}
|
|
|
|
// Call with fast-path enabled (if vDSO symbol found at startup)
|
|
time.Now()
|
|
|
|
// Call with fast-path disabled
|
|
vdsoClockgettimeSym = 0
|
|
time.Now()
|
|
vdsoClockgettimeSym = save
|
|
}
|
|
|
|
func BenchmarkClockVDSOAndFallbackPaths(b *testing.B) {
|
|
run := func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
// Call via time.Now() - see comment in test above.
|
|
time.Now()
|
|
}
|
|
}
|
|
|
|
save := vdsoClockgettimeSym
|
|
b.Run("vDSO", run)
|
|
vdsoClockgettimeSym = 0
|
|
b.Run("Fallback", run)
|
|
vdsoClockgettimeSym = save
|
|
}
|
|
|
|
func BenchmarkTimeNow(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
time.Now()
|
|
}
|
|
}
|