File tree Expand file tree Collapse file tree 3 files changed +113
-0
lines changed
examples/singleapp/os_open_benchmark Expand file tree Collapse file tree 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/os@go1.23.5#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