File tree 3 files changed +113
-0
lines changed
examples/singleapp/os_open_benchmark
3 files changed +113
-0
lines changed Original file line number Diff line number Diff line change
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 number Diff line number Diff line change
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 number Diff line number Diff line change
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
+ }
You can’t perform that action at this time.
0 commit comments