diff --git a/map_test.go b/map_test.go index 3fda8de..1e39154 100644 --- a/map_test.go +++ b/map_test.go @@ -37,3 +37,15 @@ func TestMapLarge(t *testing.T) { assert.Equal(t, 0, result[0]) assert.Equal(t, 19998, result[9999]) } + +func BenchmarkMap(b *testing.B) { + data := make([]int, 1000) + for i := range data { + data[i] = i + } + + b.ResetTimer() + for i := 0; i < b.N; i++ { + u.Map(data, func(n int) int { return n * 2 }) + } +} diff --git a/parallel_map_test.go b/parallel_map_test.go index 5deb8ed..bedd573 100644 --- a/parallel_map_test.go +++ b/parallel_map_test.go @@ -3,6 +3,7 @@ package underscore_test import ( "context" "errors" + "fmt" "testing" "github.com/stretchr/testify/assert" @@ -40,3 +41,44 @@ func TestParallelMap_DefaultWorkers(t *testing.T) { assert.NoError(t, err) assert.Equal(t, []int{2, 3, 4}, out) } + +func BenchmarkParallelMap(b *testing.B) { + data := make([]int, 1000) + for i := range data { + data[i] = i + } + ctx := context.Background() + + for _, workers := range []int{1, 2, 4, 8} { + b.Run(fmt.Sprintf("workers=%d", workers), func(b *testing.B) { + b.ResetTimer() + for i := 0; i < b.N; i++ { + u.ParallelMap(ctx, data, workers, func(_ context.Context, n int) (int, error) { + return n * 2, nil + }) + } + }) + } +} + +func BenchmarkMapVsParallelMap(b *testing.B) { + data := make([]int, 10000) + for i := range data { + data[i] = i + } + ctx := context.Background() + + b.Run("Map", func(b *testing.B) { + for i := 0; i < b.N; i++ { + u.Map(data, func(n int) int { return n * 2 }) + } + }) + + b.Run("ParallelMap", func(b *testing.B) { + for i := 0; i < b.N; i++ { + u.ParallelMap(ctx, data, 0, func(_ context.Context, n int) (int, error) { + return n * 2, nil + }) + } + }) +} diff --git a/partition_test.go b/partition_test.go index a27b8d5..b7a14db 100644 --- a/partition_test.go +++ b/partition_test.go @@ -46,3 +46,15 @@ func TestPartitionAllReject(t *testing.T) { assert.Empty(t, keep) assert.Equal(t, nums, reject) } + +func BenchmarkPartition(b *testing.B) { + data := make([]int, 1000) + for i := range data { + data[i] = i + } + + b.ResetTimer() + for i := 0; i < b.N; i++ { + u.Partition(data, func(n int) bool { return n%2 == 0 }) + } +} diff --git a/reduce_test.go b/reduce_test.go index dfd08d9..44a0935 100644 --- a/reduce_test.go +++ b/reduce_test.go @@ -27,3 +27,15 @@ func TestReduceSingleElement(t *testing.T) { result := u.Reduce([]int{5}, func(n, acc int) int { return n + acc }, 0) assert.Equal(t, 5, result) } + +func BenchmarkReduce(b *testing.B) { + data := make([]int, 1000) + for i := range data { + data[i] = i + } + + b.ResetTimer() + for i := 0; i < b.N; i++ { + u.Reduce(data, func(n, acc int) int { return n + acc }, 0) + } +} diff --git a/unique_test.go b/unique_test.go index b4d7aab..370c22f 100644 --- a/unique_test.go +++ b/unique_test.go @@ -36,3 +36,28 @@ func TestUniqueAllSame(t *testing.T) { result := u.Unique(nums) assert.Equal(t, []int{5}, result) } + +func BenchmarkUnique(b *testing.B) { + data := make([]int, 1000) + for i := range data { + data[i] = i % 100 // Many duplicates + } + + b.ResetTimer() + for i := 0; i < b.N; i++ { + u.Unique(data) + } +} + +func BenchmarkUniqueInPlace(b *testing.B) { + for i := 0; i < b.N; i++ { + b.StopTimer() + data := make([]int, 1000) + for j := range data { + data[j] = j % 100 + } + b.StartTimer() + + u.UniqueInPlace(data) + } +}