pingcap/tidb

use monotonic time directly instead of Go time in somewhere

Open

#32 121 ouverte le 7 févr. 2022

Voir sur GitHub
 (6 commentaires) (3 réactions) (1 assigné)Go (6 186 forks)batch import
help wantedtype/enhancementtype/performance

Métriques du dépôt

Stars
 (40 090 stars)
Métriques de merge PR
 (Merge moyen 14j 4h) (346 PRs mergées en 30 j)

Description

Enhancement

In TiDB, we heavily use Go time.Now to calculate the duration of some operations, e.g. prometheus Histogram, query time, etc.

For time.Now, this function will call walltime and nanotime, but in the above scenario, we only need to call nanotime(monotonic clock) to calculate the duration.

import _ "unsafe"
//go:noescape
//go:linkname nanotime runtime.nanotime
func nanotime() int64

func Now() time.Duration {
	return time.Duration(nanotime())
}

Here is a simple implementation for Nanotime,


func BenchmarkTime1(b *testing.B) {
	for i := 0; i < b.N; i++ {
		time.Now()
	}
}

func BenchmarkTime2(b *testing.B) {
	for i := 0; i < b.N; i++ {
		Now()
	}
}

The benchmark result is:

BenchmarkTime1-8          	17705235	        65.90 ns/op
BenchmarkTime2-8          	38601799	        29.68 ns/op

Guide contributeur