1
0
mirror of https://github.com/golang/go synced 2024-11-19 09:54:49 -07:00
go/src/runtime/vdso_linux_test.go
Meng Zhuo ea59ebd338 runtime: use vDSO for clock_gettime on linux/arm64
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>
2018-03-27 13:21:27 +00:00

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()
}
}