Created
August 25, 2022 09:16
-
-
Save Deleplace/067ed63b3c8db5975f21bd4eb0488efd to your computer and use it in GitHub Desktop.
Benchmark: delete from slice vs. delete from slice and zero the discarded right tail
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package slices | |
import "testing" | |
func delete[S ~[]E, E any](s S, i, j int) S { | |
_ = s[i:j] // bound check | |
return append(s[:i], s[j:]...) | |
} | |
func deleteAndZero[S ~[]E, E any](s S, i, j int) S { | |
_ = s[i:j] // bound check | |
var zero E | |
result := append(s[:i], s[j:]...) | |
for k := len(s) - (j - i); k < len(s); k++ { | |
s[k] = zero // Let the GC do its work | |
} | |
return result | |
} | |
// | |
// int | |
// | |
func BenchmarkDelete_int_1_50(b *testing.B) { | |
a := make([]int, 50) | |
b.ResetTimer() | |
for i := 0; i < b.N; i++ { | |
_ = delete(a, 30, 31) | |
} | |
} | |
func BenchmarkDeleteAndZero_int_1_50(b *testing.B) { | |
a := make([]int, 50) | |
b.ResetTimer() | |
for i := 0; i < b.N; i++ { | |
_ = deleteAndZero(a, 30, 31) | |
} | |
} | |
func BenchmarkDelete_int_1_5000(b *testing.B) { | |
a := make([]int, 5000) | |
b.ResetTimer() | |
for i := 0; i < b.N; i++ { | |
_ = delete(a, 3000, 3001) | |
} | |
} | |
func BenchmarkDeleteAndZero_int_1_5000(b *testing.B) { | |
a := make([]int, 5000) | |
b.ResetTimer() | |
for i := 0; i < b.N; i++ { | |
_ = deleteAndZero(a, 3000, 3001) | |
} | |
} | |
func BenchmarkDelete_int_10_50(b *testing.B) { | |
a := make([]int, 50) | |
b.ResetTimer() | |
for i := 0; i < b.N; i++ { | |
_ = delete(a, 30, 40) | |
} | |
} | |
func BenchmarkDeleteAndZero_int_10_50(b *testing.B) { | |
a := make([]int, 50) | |
b.ResetTimer() | |
for i := 0; i < b.N; i++ { | |
_ = deleteAndZero(a, 30, 40) | |
} | |
} | |
func BenchmarkDelete_int_1000_5000(b *testing.B) { | |
a := make([]int, 5000) | |
b.ResetTimer() | |
for i := 0; i < b.N; i++ { | |
_ = delete(a, 3000, 4000) | |
} | |
} | |
func BenchmarkDeleteAndZero_int_1000_5000(b *testing.B) { | |
a := make([]int, 5000) | |
b.ResetTimer() | |
for i := 0; i < b.N; i++ { | |
_ = deleteAndZero(a, 3000, 4000) | |
} | |
} | |
// | |
// *int | |
// | |
func BenchmarkDelete_pint_1_50(b *testing.B) { | |
a := make([]*int, 50) | |
b.ResetTimer() | |
for i := 0; i < b.N; i++ { | |
_ = delete(a, 30, 31) | |
} | |
} | |
func BenchmarkDeleteAndZero_pint_1_50(b *testing.B) { | |
a := make([]*int, 50) | |
b.ResetTimer() | |
for i := 0; i < b.N; i++ { | |
_ = deleteAndZero(a, 30, 31) | |
} | |
} | |
func BenchmarkDelete_pint_1_5000(b *testing.B) { | |
a := make([]*int, 5000) | |
b.ResetTimer() | |
for i := 0; i < b.N; i++ { | |
_ = delete(a, 3000, 3001) | |
} | |
} | |
func BenchmarkDeleteAndZero_pint_1_5000(b *testing.B) { | |
a := make([]*int, 5000) | |
b.ResetTimer() | |
for i := 0; i < b.N; i++ { | |
_ = deleteAndZero(a, 3000, 3001) | |
} | |
} | |
func BenchmarkDelete_pint_10_50(b *testing.B) { | |
a := make([]*int, 50) | |
b.ResetTimer() | |
for i := 0; i < b.N; i++ { | |
_ = delete(a, 30, 40) | |
} | |
} | |
func BenchmarkDeleteAndZero_pint_10_50(b *testing.B) { | |
a := make([]*int, 50) | |
b.ResetTimer() | |
for i := 0; i < b.N; i++ { | |
_ = deleteAndZero(a, 30, 40) | |
} | |
} | |
func BenchmarkDelete_pint_1000_5000(b *testing.B) { | |
a := make([]*int, 5000) | |
b.ResetTimer() | |
for i := 0; i < b.N; i++ { | |
_ = delete(a, 3000, 4000) | |
} | |
} | |
func BenchmarkDeleteAndZero_pint_1000_5000(b *testing.B) { | |
a := make([]*int, 5000) | |
b.ResetTimer() | |
for i := 0; i < b.N; i++ { | |
_ = deleteAndZero(a, 3000, 4000) | |
} | |
} | |
// | |
// [64]byte | |
// | |
type data [64]byte | |
func BenchmarkDelete_data_1_50(b *testing.B) { | |
a := make([]data, 50) | |
b.ResetTimer() | |
for i := 0; i < b.N; i++ { | |
_ = delete(a, 30, 31) | |
} | |
} | |
func BenchmarkDeleteAndZero_data_1_50(b *testing.B) { | |
a := make([]data, 50) | |
b.ResetTimer() | |
for i := 0; i < b.N; i++ { | |
_ = deleteAndZero(a, 30, 31) | |
} | |
} | |
func BenchmarkDelete_data_1_5000(b *testing.B) { | |
a := make([]data, 5000) | |
b.ResetTimer() | |
for i := 0; i < b.N; i++ { | |
_ = delete(a, 3000, 3001) | |
} | |
} | |
func BenchmarkDeleteAndZero_data_1_5000(b *testing.B) { | |
a := make([]data, 5000) | |
b.ResetTimer() | |
for i := 0; i < b.N; i++ { | |
_ = deleteAndZero(a, 3000, 3001) | |
} | |
} | |
func BenchmarkDelete_data_10_50(b *testing.B) { | |
a := make([]data, 50) | |
b.ResetTimer() | |
for i := 0; i < b.N; i++ { | |
_ = delete(a, 30, 40) | |
} | |
} | |
func BenchmarkDeleteAndZero_data_10_50(b *testing.B) { | |
a := make([]data, 50) | |
b.ResetTimer() | |
for i := 0; i < b.N; i++ { | |
_ = deleteAndZero(a, 30, 40) | |
} | |
} | |
func BenchmarkDelete_data_1000_5000(b *testing.B) { | |
a := make([]data, 5000) | |
b.ResetTimer() | |
for i := 0; i < b.N; i++ { | |
_ = delete(a, 3000, 4000) | |
} | |
} | |
func BenchmarkDeleteAndZero_data_1000_5000(b *testing.B) { | |
a := make([]data, 5000) | |
b.ResetTimer() | |
for i := 0; i < b.N; i++ { | |
_ = deleteAndZero(a, 3000, 4000) | |
} | |
} | |
// | |
// *[64]byte | |
// | |
func BenchmarkDelete_pdata_1_50(b *testing.B) { | |
a := make([]*data, 50) | |
b.ResetTimer() | |
for i := 0; i < b.N; i++ { | |
_ = delete(a, 30, 31) | |
} | |
} | |
func BenchmarkDeleteAndZero_pdata_1_50(b *testing.B) { | |
a := make([]*data, 50) | |
b.ResetTimer() | |
for i := 0; i < b.N; i++ { | |
_ = deleteAndZero(a, 30, 31) | |
} | |
} | |
func BenchmarkDelete_pdata_1_5000(b *testing.B) { | |
a := make([]*data, 5000) | |
b.ResetTimer() | |
for i := 0; i < b.N; i++ { | |
_ = delete(a, 3000, 3001) | |
} | |
} | |
func BenchmarkDeleteAndZero_pdata_1_5000(b *testing.B) { | |
a := make([]*data, 5000) | |
b.ResetTimer() | |
for i := 0; i < b.N; i++ { | |
_ = deleteAndZero(a, 3000, 3001) | |
} | |
} | |
func BenchmarkDelete_pdata_10_50(b *testing.B) { | |
a := make([]*data, 50) | |
b.ResetTimer() | |
for i := 0; i < b.N; i++ { | |
_ = delete(a, 30, 40) | |
} | |
} | |
func BenchmarkDeleteAndZero_pdata_10_50(b *testing.B) { | |
a := make([]*data, 50) | |
b.ResetTimer() | |
for i := 0; i < b.N; i++ { | |
_ = deleteAndZero(a, 30, 40) | |
} | |
} | |
func BenchmarkDelete_pdata_1000_5000(b *testing.B) { | |
a := make([]*data, 5000) | |
b.ResetTimer() | |
for i := 0; i < b.N; i++ { | |
_ = delete(a, 3000, 4000) | |
} | |
} | |
func BenchmarkDeleteAndZero_pdata_1000_5000(b *testing.B) { | |
a := make([]*int, 5000) | |
b.ResetTimer() | |
for i := 0; i < b.N; i++ { | |
_ = deleteAndZero(a, 3000, 4000) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Results on my workstation: