diff --git a/stopwatch/stopwatch.go b/stopwatch/stopwatch.go new file mode 100644 index 0000000..b49681b --- /dev/null +++ b/stopwatch/stopwatch.go @@ -0,0 +1,76 @@ +package stopwatch + +import ( + "time" +) + +type watch struct { + startTime time.Time + elapsed time.Duration + isRunning bool +} + +func StartNew() *watch { + w := &watch{} + w.Start() + + return w +} + +func (w *watch) Start() { + if !w.isRunning { + w.startTime = time.Now() + w.isRunning = true + } +} + +// 将运行时间重置为零,并开始测量运行时间。 +func (w *watch) Restart() { + w.elapsed = 0 + w.startTime = time.Now() + w.isRunning = true +} + +// 停止时间间隔测量并将经过的时间重置为零。 +func (w *watch) Reset() { + w.elapsed = 0 + w.startTime = time.Now() + w.isRunning = false +} + +func (w *watch) Stop() { + if w.isRunning { + num := time.Since(w.startTime) + w.elapsed += num + w.isRunning = false + + if w.elapsed < 0 { + w.elapsed = 0 + } + } +} + +func (w *watch) IsRunning() bool { + return w.isRunning +} + +func (w *watch) Elapsed() time.Duration { + return time.Duration(w.ElapsedNanoseconds()) +} + +func (w *watch) ElapsedMilliseconds() int64 { + return w.ElapsedNanoseconds() / 1e6 +} + +func (w *watch) ElapsedMicroseconds() int64 { + return w.ElapsedNanoseconds() / 1e3 +} + +func (w *watch) ElapsedNanoseconds() int64 { + num := w.elapsed + if w.isRunning { + num += time.Since(w.startTime) + } + + return num.Nanoseconds() +} diff --git a/stopwatch/stopwatch_test.go b/stopwatch/stopwatch_test.go new file mode 100644 index 0000000..e267915 --- /dev/null +++ b/stopwatch/stopwatch_test.go @@ -0,0 +1,30 @@ +package stopwatch_test + +import ( + "testing" + "time" + + "github.com/charlienet/go-mixed/stopwatch" +) + +func TestWatch(t *testing.T) { + watch := stopwatch.StartNew() + + time.Sleep(time.Second * 3) + t.Log("Elapsed:", watch.Elapsed()) + t.Log("Elapsed:", watch.ElapsedMilliseconds()) + t.Log("Elapsed:", watch.ElapsedMicroseconds()) + t.Log("Elapsed:", watch.ElapsedNanoseconds()) + + time.Sleep(time.Second * 1) + t.Log("Elapsed:", watch.Elapsed()) + + watch.Restart() + t.Log("Elapsed:", watch.Elapsed()) + time.Sleep(time.Second * 1) + t.Log("Elapsed:", watch.Elapsed()) + + watch.Reset() + + watch.Restart() +}