false_sharing_test.go 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. package main
  2. import (
  3. "sync"
  4. "sync/atomic"
  5. "testing"
  6. )
  7. type nopad struct {
  8. x uint64
  9. y uint64
  10. }
  11. type withpad struct {
  12. x uint64
  13. _pad [7]uint64
  14. y uint64
  15. }
  16. func BenchmarkNoPad(b *testing.B) {
  17. for i := 0; i < b.N; i++ {
  18. var np nopad
  19. var wg sync.WaitGroup
  20. wg.Add(20)
  21. for i := 0; i < 10; i++ {
  22. go func() {
  23. defer wg.Done()
  24. for {
  25. if atomic.AddUint64(&np.x, 1) >= 10000000 {
  26. return
  27. }
  28. }
  29. }()
  30. }
  31. for i := 0; i < 10; i++ {
  32. go func() {
  33. defer wg.Done()
  34. for {
  35. if atomic.AddUint64(&np.y, 1) >= 10000000 {
  36. return
  37. }
  38. }
  39. }()
  40. }
  41. wg.Wait()
  42. }
  43. }
  44. func BenchmarkWithPad(b *testing.B) {
  45. for i := 0; i < b.N; i++ {
  46. var np withpad
  47. var wg sync.WaitGroup
  48. wg.Add(20)
  49. for i := 0; i < 10; i++ {
  50. go func() {
  51. defer wg.Done()
  52. for {
  53. if atomic.AddUint64(&np.x, 1) >= 10000000 {
  54. return
  55. }
  56. }
  57. }()
  58. }
  59. for i := 0; i < 10; i++ {
  60. go func() {
  61. defer wg.Done()
  62. for {
  63. if atomic.AddUint64(&np.y, 1) >= 10000000 {
  64. return
  65. }
  66. }
  67. }()
  68. }
  69. wg.Wait()
  70. }
  71. }