statis.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. package otherutils
  2. import (
  3. "leafstalk/log"
  4. "time"
  5. )
  6. type HitCount struct {
  7. count int
  8. tick int64
  9. isAcc bool
  10. name string
  11. }
  12. func NewHitCount(name string, isAcc bool) *HitCount {
  13. hc := new(HitCount)
  14. hc.name = name
  15. hc.isAcc = isAcc
  16. return hc
  17. }
  18. // 统计调用次数或每秒调用次数
  19. // 1000000
  20. func (h *HitCount) Hit() {
  21. h.count += 1
  22. if h.count%300 == 0 {
  23. ct := time.Now().Unix()
  24. if ct-h.tick >= 5 {
  25. if h.isAcc {
  26. log.Warnf("%s receivePacket Count %v", h.name, h.count)
  27. } else {
  28. log.Warnf("%s receivePacket Count %v", h.name, h.count/5)
  29. h.count = 0
  30. }
  31. h.tick = ct
  32. }
  33. }
  34. }
  35. // 按指定频率调用callBack,
  36. func StartTicker(d time.Duration, name string, rate int, callBack func()) {
  37. stopTimer := time.NewTimer(d)
  38. logTicker := time.NewTicker(time.Second * 2)
  39. // 1s = 20*50MS
  40. sendTicker := time.NewTicker(time.Millisecond * 50)
  41. rate = (rate + 19) / 20
  42. go func() {
  43. wt := time.NewTimer(5 * time.Second)
  44. <-wt.C
  45. ncount := 0
  46. for {
  47. select {
  48. case <-stopTimer.C:
  49. logTicker.Stop()
  50. log.Warnf("%s sendPacket End: %v", name, ncount)
  51. return
  52. case <-logTicker.C:
  53. log.Warnf("%s sendPacket Count: %v", name, ncount/2)
  54. ncount = 0
  55. continue
  56. case <-sendTicker.C:
  57. for i := 0; i < rate; i += 1 {
  58. callBack()
  59. ncount += 1
  60. }
  61. }
  62. }
  63. }()
  64. }