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?