Skip to content

Commit 051d337

Browse files
authored
Merge pull request #885 from devlights/add-os-open-benchmark
2 parents 47c2abb + f8655b4 commit 051d337

File tree

3 files changed

+113
-0
lines changed

3 files changed

+113
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# これは何?
2+
3+
ファイル処理をする際に、[os.Open](https://pkg.go.dev/[email protected]#Open)を毎回実施するのと、開きっぱなしで処理するのとでは、どれくらいパフォーマンスが違うのかについてのサンプルです。
4+
5+
以下の記事を見て、自分用にサンプルとしてここに追加しました。
6+
7+
- [os.Open自体のオーバーヘッドについて](https://qiita.com/Uchijo/items/9337a199040e06b96118)
8+
9+
## 実行結果
10+
11+
```sh
12+
$ task -d examples/singleapp/os_open_benchmark/
13+
task: [default] go test . -bench=. -run=^$
14+
goos: linux
15+
goarch: amd64
16+
pkg: github.com/devlights/try-golang/examples/singleapp/os_open_benchmark
17+
cpu: AMD EPYC 7B13
18+
BenchmarkOsOpenEvery-16 118224 9920 ns/op
19+
BenchmarkOsOpenKeep-16 751408 1526 ns/op
20+
PASS
21+
ok github.com/devlights/try-golang/examples/singleapp/os_open_benchmark 3.862s
22+
```
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# https://taskfile.dev
2+
3+
version: '3'
4+
5+
tasks:
6+
default:
7+
cmds:
8+
- go vet .
9+
- staticcheck .
10+
- go test . -bench=. -run=^$
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package main
2+
3+
import (
4+
"io"
5+
"os"
6+
"testing"
7+
)
8+
9+
var (
10+
fname string
11+
buf = make([]byte, 10)
12+
)
13+
14+
func setup() {
15+
f, err := os.CreateTemp("", "trygolang-tmp-")
16+
if err != nil {
17+
panic(err)
18+
}
19+
defer f.Close()
20+
21+
_, err = f.Write([]byte("helloworld\n"))
22+
if err != nil {
23+
panic(err)
24+
}
25+
26+
fname = f.Name()
27+
}
28+
29+
func teardown() {
30+
err := os.Remove(fname)
31+
if err != nil {
32+
panic(err)
33+
}
34+
}
35+
36+
func BenchmarkOsOpenEvery(b *testing.B) {
37+
setup()
38+
b.Cleanup(teardown)
39+
b.ResetTimer()
40+
41+
for range b.N {
42+
f, err := os.Open(fname)
43+
if err != nil {
44+
panic(err)
45+
}
46+
defer f.Close()
47+
48+
clear(buf)
49+
50+
_, err = f.Read(buf)
51+
if err != nil {
52+
panic(err)
53+
}
54+
}
55+
}
56+
57+
func BenchmarkOsOpenKeep(b *testing.B) {
58+
setup()
59+
b.Cleanup(teardown)
60+
b.ResetTimer()
61+
62+
f, err := os.Open(fname)
63+
if err != nil {
64+
panic(err)
65+
}
66+
defer f.Close()
67+
68+
for range b.N {
69+
_, err = f.Seek(0, io.SeekStart)
70+
if err != nil {
71+
panic(err)
72+
}
73+
74+
clear(buf)
75+
76+
_, err = f.Read(buf)
77+
if err != nil {
78+
panic(err)
79+
}
80+
}
81+
}

0 commit comments

Comments
 (0)