profiler.go 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package log
  2. import "time"
  3. type Profiler struct {
  4. profiles map[string]time.Duration
  5. starts map[string]time.Time
  6. }
  7. func NewProfiler() *Profiler {
  8. return &Profiler{
  9. profiles: map[string]time.Duration{},
  10. starts: map[string]time.Time{},
  11. }
  12. }
  13. func (p *Profiler) Start(name string) {
  14. if p == nil {
  15. return
  16. }
  17. p.starts[name] = time.Now()
  18. }
  19. func (p *Profiler) Stop(name string) time.Duration {
  20. if p == nil {
  21. return 0
  22. }
  23. if start, ok := p.starts[name]; ok {
  24. elapsed := time.Since(start)
  25. p.profiles[name] += elapsed
  26. return elapsed
  27. }
  28. return 0
  29. }
  30. func (p *Profiler) Log(name string) {
  31. if p == nil {
  32. return
  33. }
  34. Profilef("%s: %s", p.profiles[name], name)
  35. }
  36. func (p *Profiler) LogAll() {
  37. if p == nil {
  38. return
  39. }
  40. // Print profiles, largest to smallest. (Inefficient, but shouldn't matter.)
  41. print := map[string]time.Duration{}
  42. for name, value := range p.profiles {
  43. print[name] = value
  44. }
  45. for len(print) > 0 {
  46. largest := ""
  47. for name := range print {
  48. if print[name] > print[largest] {
  49. largest = name
  50. }
  51. }
  52. Profilef("%s: %s", print[largest], largest)
  53. delete(print, largest)
  54. }
  55. }