https://github.com/sendgrid/stopwatch
Benchmark your Go code with this utility for keeping track of timing information for different states.
https://github.com/sendgrid/stopwatch
coreplatform
Last synced: 6 days ago
JSON representation
Benchmark your Go code with this utility for keeping track of timing information for different states.
- Host: GitHub
- URL: https://github.com/sendgrid/stopwatch
- Owner: sendgrid
- License: bsd-3-clause
- Created: 2015-03-24T23:12:20.000Z (almost 11 years ago)
- Default Branch: master
- Last Pushed: 2019-03-04T08:04:44.000Z (about 7 years ago)
- Last Synced: 2025-09-05T16:46:02.642Z (7 months ago)
- Topics: coreplatform
- Language: Go
- Homepage:
- Size: 24.4 KB
- Stars: 10
- Watchers: 178
- Forks: 7
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE.md
Awesome Lists containing this project
README
stopwatch
==========
This package offers a nice solution to take some measurements of the various states of your application. It is a non high-resolution timer that is designed to be fast giving you an accurate picture of how long your code paths are taking.
[](https://travis-ci.org/sendgrid/stopwatch)
[](https://goreportcard.com/report/github.com/sendgrid/stopwatch)
[](https://godoc.org/github.com/sendgrid/stopwatch)
### Usage
```Go
package main
import (
"encoding/json"
"fmt"
"github.com/sendgrid/stopwatch"
"time"
)
func main() {
// Create a new StopWatch that starts off counting
sw := stopwatch.New(0, true)
// Optionally, format that time.Duration how you need it
// sw.SetFormatter(func(duration time.Duration) string {
// return fmt.Sprintf("%.3f", (duration.Seconds()*1000.0)/1000.0)
// })
// Take measurement of various states
sw.Lap("Create File")
// Simulate some time by sleeping
time.Sleep(time.Millisecond * 300)
sw.Lap("Edit File")
time.Sleep(time.Second * 2)
sw.Lap("Save File")
time.Sleep(time.Second * 3)
sw.Lap("Upload File")
// Take a measurement with some additional metadata
time.Sleep(time.Millisecond * 20)
sw.LapWithData("Delete File", map[string]interface{}{
"filename": "word.doc",
"size": "1024",
})
// Stop the timer
sw.Stop()
// Marshal to json
if b, err := json.Marshal(sw); err == nil {
fmt.Println(string(b))
}
}
```
You can also use stopwatch inside different goroutines like so,
```Go
// Create a new StopWatch that starts off counting
sw := New(0, true)
// Optionally, format that time.Duration how you need it
sw.SetFormatter(func(duration time.Duration) string {
return fmt.Sprintf("%.1f", duration.Seconds())
})
// Take measurement of various states
sw.Lap("Create File")
var wg sync.WaitGroup
wg.Add(2)
go func() {
defer wg.Done()
for i := 0; i < 2; i++ {
time.Sleep(time.Millisecond * 200)
task := fmt.Sprintf("task %d", i)
sw.Lap(task)
}
}()
go func() {
defer wg.Done()
time.Sleep(time.Second * 1)
task := "task A"
sw.LapWithData(task, map[string]interface{}{
"filename": "word.doc",
})
}()
// Simulate some time by sleeping
time.Sleep(time.Second * 1)
sw.Lap("Upload File")
// Stop the timer
wg.Wait()
sw.Stop()
// Marshal to json
if b, err := json.Marshal(sw); err == nil {
fmt.Println(string(b))
}
// Output:
// [{"state":"Create File","time":"0.0"},{"state":"task 0","time":"0.2"},{"state":"task 1","time":"0.2"},{"state":"Upload File","time":"0.6"},{"state":"task A","time":"0.0","filename":"word.doc"}]
```
### Sample Output in Json format
```json
[
{
"state": "Create File",
"time": "1.341"
},
{
"state": "Edit File",
"time": "300.48635"
},
{
"state": "Save File",
"time": "2.001098212"
},
{
"state": "Upload File",
"time": "3.000983896"
},
{
"state": "Delete File",
"time": "20.724059",
"filename": "word.doc",
"size": "1024"
}
]
```