go语言写入测试
package main
import (
"crypto/rand"
"os"
"testing"
)
func BenchmarkFile(b *testing.B) {
f, err := os.OpenFile("/home/cjs/elastic/1.txt", os.O_RDWR|os.O_CREATE, 0666)
if err != nil {
panic(err)
}
defer f.Close()
blob := make([]byte, 1024*1024)
if _, err := rand.Read(blob); err != nil {
panic(err)
}
b.ResetTimer()
for i := 0; i < b.N; i++ {
b.StartTimer()
_,err := f.Write(blob)
if err != nil {
panic(err)
}
b.StopTimer()
}
}
func BenchmarkMem(b *testing.B) {
mblob := make([]byte, 1024*1024)
blob := make([]byte, 1024*1024)
if _, err := rand.Read(blob); err != nil {
panic(err)
}
b.ResetTimer()
for i := 0; i < b.N; i++ {
b.StartTimer()
copy(mblob, blob)
b.StopTimer()
}
}
~/elastic$ go test -bench=.
goos: linux
goarch: amd64
pkg: elastic
cpu: Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz
BenchmarkFile-2 1962 2355674 ns/op
BenchmarkMem-2 26989 42116 ns/op
PASS
ok elastic 7.618s
结论:虽然文件写入是写入页缓存,但是调用writer函数的时候,如果页缓存的达到了上限,就必须进行一次磁盘IO,导致速度变慢。
可以参考:write文件一个字节后何时发起写磁盘IO?