package main

import (
	"sync"
	"testing"
)

type SimpleStruct struct {
	n int
}

func BenchmarkStructureFalseSharing(b *testing.B) {
	structA := SimpleStruct{}
	structB := SimpleStruct{}
	wg := sync.WaitGroup{}
	M := 1000000
	b.ResetTimer()
	for i := 0; i < b.N; i++ {
		wg.Add(2)
		go func() {
			for j := 0; j < M; j++ {
				structA.n += j
			}
			wg.Done()
		}()
		go func() {
			for j := 0; j < M; j++ {
				structB.n += j
			}
			wg.Done()
		}()
		wg.Wait()
	}
}

func BenchmarkCopyAVX2(b *testing.B) {
	a := make([]byte, 128*1024*1024)
	c := make([]byte, 128*1024*1024)

	b.ResetTimer()
	for i := 0; i < b.N; i++ {
		CopySlice_AVX2(a, c, len(c))
	}
}

func BenchmarkCopy(b *testing.B) {
	a := make([]byte, 128*1024*1024)
	c := make([]byte, 128*1024*1024)

	b.ResetTimer()
	for i := 0; i < b.N; i++ {
		CopySlice(a, c, len(c))
	}
}
