Skip to content

Commit abddea5

Browse files
authored
Merge pull request #663 from devlights:add-speeddiff-append-string-to-byte-slice
Add speeds for setting strings to byteslice
2 parents 39ebdf5 + cdbb648 commit abddea5

File tree

3 files changed

+81
-0
lines changed

3 files changed

+81
-0
lines changed
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# これは何?
2+
3+
バイトスライスに対して
4+
5+
- fmt.Sprintf
6+
- fmt.Appendf
7+
- 直接appendで追加していく
8+
9+
のどれが最も速いのかをベンチマークしてみたものです。
10+
11+
[slogのハンドラ作成ガイドドキュメント](https://github.com/golang/example/blob/master/slog-handler-guide/README.md#speed)に記載があったので試してみました。
12+
13+
以下、Gitpod上で試してみた結果です。
14+
15+
```sh
16+
$ task
17+
goos: linux
18+
goarch: amd64
19+
pkg: github.com/devlights/try-golang/examples/singleapp/speed_diff_append_string_to_byteslice
20+
cpu: AMD EPYC 7B13
21+
BenchmarkUseFmtSprintf-16 3160230 320.0 ns/op
22+
BenchmarkUseFmtAppendf-16 9861033 133.7 ns/op
23+
BenchmarkUseDirectAppend-16 21009861 83.87 ns/op
24+
PASS
25+
ok github.com/devlights/try-golang/examples/singleapp/speed_diff_append_string_to_byteslice 7.914s
26+
```
27+
28+
処理は冗長になってしまいますが、直接appendが最も速いです。
29+
30+
## SeeAlso
31+
32+
- https://gist.github.com/devlights/ffd22f78297a563c9bebcb9a9baa7f5f
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# https://taskfile.dev
2+
3+
version: '3'
4+
5+
tasks:
6+
default:
7+
cmds:
8+
- go test -bench .
9+
silent: true
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"strconv"
6+
"testing"
7+
)
8+
9+
func BenchmarkUseFmtSprintf(b *testing.B) {
10+
b.StopTimer()
11+
buf := make([]byte, 0, 1024*1024*500)
12+
b.StartTimer()
13+
14+
for i := 0; i < b.N; i++ {
15+
s := fmt.Sprintf("%s:%d\n", "key", i)
16+
buf = append(buf, s...) //lint:ignore SA4010 It's ok.
17+
}
18+
}
19+
20+
func BenchmarkUseFmtAppendf(b *testing.B) {
21+
b.StopTimer()
22+
buf := make([]byte, 0, 1024*1024*500)
23+
b.StartTimer()
24+
25+
for i := 0; i < b.N; i++ {
26+
buf = fmt.Appendf(buf, "%s:%d\n", "key", i)
27+
}
28+
}
29+
30+
func BenchmarkUseDirectAppend(b *testing.B) {
31+
b.StopTimer()
32+
buf := make([]byte, 0, 1024*1024*500)
33+
b.StartTimer()
34+
35+
for i := 0; i < b.N; i++ {
36+
buf = append(buf, "key:"...) //lint:ignore SA4010 It's ok.
37+
buf = append(buf, strconv.Itoa(i)...) //lint:ignore SA4010 It's ok.
38+
buf = append(buf, '\n') //lint:ignore SA4010 It's ok.
39+
}
40+
}

0 commit comments

Comments
 (0)