|  | @@ -0,0 +1,76 @@
 | 
	
		
			
				|  |  | +package main
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +import (
 | 
	
		
			
				|  |  | +	"sync"
 | 
	
		
			
				|  |  | +	"sync/atomic"
 | 
	
		
			
				|  |  | +	"testing"
 | 
	
		
			
				|  |  | +)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +type nopad struct {
 | 
	
		
			
				|  |  | +	x uint64
 | 
	
		
			
				|  |  | +	y uint64
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +type withpad struct {
 | 
	
		
			
				|  |  | +	x    uint64
 | 
	
		
			
				|  |  | +	_pad [7]uint64
 | 
	
		
			
				|  |  | +	y    uint64
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +func BenchmarkNoPad(b *testing.B) {
 | 
	
		
			
				|  |  | +	for i := 0; i < b.N; i++ {
 | 
	
		
			
				|  |  | +		var np nopad
 | 
	
		
			
				|  |  | +		var wg sync.WaitGroup
 | 
	
		
			
				|  |  | +		wg.Add(20)
 | 
	
		
			
				|  |  | +		for i := 0; i < 10; i++ {
 | 
	
		
			
				|  |  | +			go func() {
 | 
	
		
			
				|  |  | +				defer wg.Done()
 | 
	
		
			
				|  |  | +				for {
 | 
	
		
			
				|  |  | +					if atomic.AddUint64(&np.x, 1) >= 10000000 {
 | 
	
		
			
				|  |  | +						return
 | 
	
		
			
				|  |  | +					}
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +			}()
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +		for i := 0; i < 10; i++ {
 | 
	
		
			
				|  |  | +			go func() {
 | 
	
		
			
				|  |  | +				defer wg.Done()
 | 
	
		
			
				|  |  | +				for {
 | 
	
		
			
				|  |  | +					if atomic.AddUint64(&np.y, 1) >= 10000000 {
 | 
	
		
			
				|  |  | +						return
 | 
	
		
			
				|  |  | +					}
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +			}()
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +		wg.Wait()
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +func BenchmarkWithPad(b *testing.B) {
 | 
	
		
			
				|  |  | +	for i := 0; i < b.N; i++ {
 | 
	
		
			
				|  |  | +		var np withpad
 | 
	
		
			
				|  |  | +		var wg sync.WaitGroup
 | 
	
		
			
				|  |  | +		wg.Add(20)
 | 
	
		
			
				|  |  | +		for i := 0; i < 10; i++ {
 | 
	
		
			
				|  |  | +			go func() {
 | 
	
		
			
				|  |  | +				defer wg.Done()
 | 
	
		
			
				|  |  | +				for {
 | 
	
		
			
				|  |  | +					if atomic.AddUint64(&np.x, 1) >= 10000000 {
 | 
	
		
			
				|  |  | +						return
 | 
	
		
			
				|  |  | +					}
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +			}()
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +		for i := 0; i < 10; i++ {
 | 
	
		
			
				|  |  | +			go func() {
 | 
	
		
			
				|  |  | +				defer wg.Done()
 | 
	
		
			
				|  |  | +				for {
 | 
	
		
			
				|  |  | +					if atomic.AddUint64(&np.y, 1) >= 10000000 {
 | 
	
		
			
				|  |  | +						return
 | 
	
		
			
				|  |  | +					}
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +			}()
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +		wg.Wait()
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +}
 |