Help us understand the problem. What is going on with this article?

ファイル書き込みの度にファイルを開いたらどれくらい遅いのか

More than 3 years have passed since last update.

ファイルに文字列を書き込む際に、書き込むたびにcloseするのって直感的に遅いような気がするけどどれくらい遅いのか軽く計測してみた。

package main_test

import (
    "os"
    "testing"
)

func BenchmarkWriteEveryOpenFile(b *testing.B) {
    for i := 0; i < b.N; i++ {
        WriteEveryOpenFile("testtest\n")
    }
}

func WriteEveryOpenFile(s string) {
    file, err := os.OpenFile("tmp", os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0666)
    if err != nil {
        panic(err)
    }
    defer file.Close()
    file.WriteString(s)
}

func BenchmarkWriteOpeningFile(b *testing.B) {
    b.StopTimer()
    file, err := os.OpenFile("tmptmp", os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0666)
    if err != nil {
        panic(err)
    }
    b.StartTimer()

    for i := 0; i < b.N; i++ {
        WriteOpeningFile(file, "testtest\n")
    }

    file.Close()
}

func WriteOpeningFile(f *os.File, s string) {
    f.WriteString(s)
}

Macbook Pro

BenchmarkWriteEveryOpenFile-4      30000             48164 ns/op              72 B/op          3 allocs/op
BenchmarkWriteOpeningFile-4      1000000              1365 ns/op               0 B/op          0 allocs/op
ok      github.com/catatsuy/bench_write 4.502s

Debian8(on VirtualBox)

BenchmarkWriteEveryOpenFile       500000              3053 ns/op              72 B/op          3 allocs/op
BenchmarkWriteOpeningFile        1000000              1382 ns/op               0 B/op          0 allocs/op
ok      _/home/vagrant/bench_write      2.969s

軽く計っただけだけど、MacとLinuxでかなり差があることに驚いた。Linuxであればパフォーマンスが重要なところでない限り、無理してファイルディスクリプタの使い回しをしなくてもよさそう。

パフォーマンスが必要な部分ではファイルディスクリプタの使い回しをしなければならないことは間違いない。しかしパフォーマンスが致命的な部分ではないのに無理にファイルディスクリプタを使い回そうとすると、ファイルが肥大化したときのログローテートができなくなるなど運用面で問題が出る。うまく使い分けていきたい。

あと手軽にパフォーマンスを計測すると最初はMacでやってしまいがちだけど、ちゃんとLinuxでも動かさないと正確な結果が出ないので(当たり前だけど)気をつけたい。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away