// 170 ns/op funcBenchmark_Sprint(b *testing.B) { for i := 0; i < b.N; i++ { _ = fmt.Sprint(rand.Int()) } }
// 81.9 ns/op funcBenchmark_Itoa(b *testing.B) { for i := 0; i < b.N; i++ { _ = strconv.Itoa(rand.Int()) } }
减少string到byte的转换
主要了解go的string到[]byte的转换还是比较耗性能的,但大部分情况下无法避免这种转换。
我们注意一种场景即可:从[]byte转换为string,再转换为[]byte。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
// 43.9 ns/op funcBenchmark_String2Bytes(b *testing.B) { data := "Hello world" w := ioutil.Discard for i := 0; i < b.N; i++ { w.Write([]byte(data)) } }
// 3.06 ns/op funcBenchmark_Bytes(b *testing.B) { data := []byte("Hello world") w := ioutil.Discard for i := 0; i < b.N; i++ { w.Write(data) } }
// 4494 ns/op funcBenchmark_NoCap(b *testing.B) { for n := 0; n < b.N; n++ { data := make([]int, 0) for k := 0; k < size; k++ { data = append(data, k) } } }
// 2086 ns/op funcBenchmark_Cap(b *testing.B) { for n := 0; n < b.N; n++ { data := make([]int, 0, size) for k := 0; k < size; k++ { data = append(data, k) } } }
// 0.0442 ns/op funcBenchmark_MapInt(b *testing.B) { var m = make(map[int]struct{}) for i := 0; i < size; i++ { m[i] = struct{}{} } b.ResetTimer() for n := 0; n < size; n++ { _, _ = m[n] } }
// 0.180 ns/op funcBenchmark_MapString(b *testing.B) { var m = make(map[string]struct{}) for i := 0; i < size; i++ { m[strconv.Itoa(i)] = struct{}{} } b.ResetTimer() for n := 0; n < size; n++ { _, _ = m[strconv.Itoa(n)] } }