maps_test.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. package utils
  2. import (
  3. "strconv"
  4. "sync"
  5. "testing"
  6. "github.com/stretchr/testify/assert"
  7. )
  8. const (
  9. NumOfReader = 200
  10. NumOfWriter = 100
  11. )
  12. func TestMaps(t *testing.T) {
  13. assert := assert.New(t)
  14. var ipAuditMap IMaps
  15. key := "one"
  16. value := 100
  17. testMapData := map[string]int{"basemap": 512, "cmap": 0, "rwmap": 512, "syncmap": 0}
  18. for name, len := range testMapData {
  19. ipAuditMap = NewMap(name, len)
  20. ipAuditMap.Set(key, value)
  21. v, ok := ipAuditMap.Get(key)
  22. assert.Equal(v.(int), value)
  23. assert.True(ok)
  24. ipAuditMap.Del(key)
  25. v, ok = ipAuditMap.Get(key)
  26. assert.Nil(v)
  27. assert.False(ok)
  28. }
  29. }
  30. func benchmarkMap(b *testing.B, hm IMaps) {
  31. for i := 0; i < b.N; i++ {
  32. var wg sync.WaitGroup
  33. for i := 0; i < NumOfWriter; i++ {
  34. wg.Add(1)
  35. go func() {
  36. for i := 0; i < 100; i++ {
  37. hm.Set(strconv.Itoa(i), i*i)
  38. hm.Set(strconv.Itoa(i), i*i)
  39. hm.Del(strconv.Itoa(i))
  40. }
  41. wg.Done()
  42. }()
  43. }
  44. for i := 0; i < NumOfReader; i++ {
  45. wg.Add(1)
  46. go func() {
  47. for i := 0; i < 100; i++ {
  48. hm.Get(strconv.Itoa(i))
  49. }
  50. wg.Done()
  51. }()
  52. }
  53. wg.Wait()
  54. }
  55. }
  56. func BenchmarkMaps(b *testing.B) {
  57. b.Run("RW map", func(b *testing.B) {
  58. myMap := NewMap("rwmap", 512)
  59. benchmarkMap(b, myMap)
  60. })
  61. b.Run("Concurrent map", func(b *testing.B) {
  62. myMap := NewMap("cmap", 0)
  63. benchmarkMap(b, myMap)
  64. })
  65. b.Run("Sync map", func(b *testing.B) {
  66. myMap := NewMap("syncmap", 0)
  67. benchmarkMap(b, myMap)
  68. })
  69. }