diff --git a/stopwatch/stopwatch.go b/stopwatch/stopwatch.go index a493a6b..6ce4d86 100644 --- a/stopwatch/stopwatch.go +++ b/stopwatch/stopwatch.go @@ -1,6 +1,7 @@ package stopwatch import ( + "sync/atomic" "time" _ "unsafe" @@ -10,6 +11,7 @@ type watch struct { startTime int64 elapsed int64 isRunning bool + count int32 } func StartNew() *watch { @@ -21,7 +23,7 @@ func StartNew() *watch { func (w *watch) Start() { if !w.isRunning { - w.startTime = runtimeNano() + w.startTime = w.RuntimeNano() w.isRunning = true } } @@ -29,22 +31,20 @@ func (w *watch) Start() { // 将运行时间重置为零,并开始测量运行时间。 func (w *watch) Restart() { w.elapsed = 0 - w.startTime = runtimeNano() + w.startTime = w.RuntimeNano() w.isRunning = true } // 停止时间间隔测量并将经过的时间重置为零。 func (w *watch) Reset() { w.elapsed = 0 - w.startTime = runtimeNano() + w.startTime = w.RuntimeNano() w.isRunning = false } func (w *watch) Stop() { if w.isRunning { - n := runtimeNano() - num := n - w.startTime - w.elapsed += num + w.elapsed += w.RuntimeNano() - w.startTime w.isRunning = false if w.elapsed < 0 { @@ -70,14 +70,18 @@ func (w *watch) ElapsedMicroseconds() int64 { } func (w *watch) ElapsedNanoseconds() int64 { - now := runtimeNano() num := w.elapsed if w.isRunning { - num += now - w.startTime + num += w.RuntimeNano() - w.startTime } return num } +func (w *watch) RuntimeNano() int64 { + atomic.AddInt32(&w.count, 1) + return runtimeNano() +} + //go:linkname runtimeNano runtime.nanotime func runtimeNano() int64 diff --git a/stopwatch/stopwatch_test.go b/stopwatch/stopwatch_test.go index 6ada7d6..0e4344b 100644 --- a/stopwatch/stopwatch_test.go +++ b/stopwatch/stopwatch_test.go @@ -42,3 +42,13 @@ func TestStop(t *testing.T) { t.Log(watch.Elapsed()) } + +func BenchmarkNanotime(b *testing.B) { + b.RunParallel(func(p *testing.PB) { + watch := stopwatch.StartNew() + + for p.Next() { + watch.ElapsedNanoseconds() + } + }) +}