Сравнение строк в Go
При сравнении двух строк Golang действует по следующему алгоритму:
Приведу в пример два сценария:
func BenchmarkComparison(b *testing.B) {
bs := make([]byte, 1<<26)
s0 := string(bs)
s1 := string(bs)
b.ResetTimer()
for i := 0; i < b.N; i++ {
_ = s0 == s1
}
} func BenchmarkComparisonOptimized(b *testing.B) {
bs := make([]byte, 1<<26)
s0 := string(bs)
s1 := s0
b.ResetTimer()
for i := 0; i < b.N; i++ {
_ = s0 == s1
}
}
Почему одного лишь указателя недостаточно для сравнения строк?
Сравнение структур данных и порядок полей
type Data1 struct {
size int32
values [10 << 20]byte
}
type Data2 struct {
values [10 << 20]byte
size int32
} func BenchmarkComparisonData1(b *testing.B) {
data1 := Data1{size: 100}
data2 := Data1{size: 101}
for i := 0; i < b.N; i++ {
_ = data1 == data2
}
}
run benchmark | debug benchmark
func BenchmarkComparisonData2(b *testing.B) {
data1 := Data2{size: 100}
data2 := Data2{size: 101}
for i := 0; i < b.N; i++ {
_ = data1 == data2
}
}
При запуске бенчмарков становится очевидно: