开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 27 天,点击查看活动详情
内存
测试硬件:笔记本16G内存6400MHz
测试代码:
const size = 1024
func BenchmarkMemoryRead(b *testing.B) {
var buf [size]byte
b.ResetTimer()
for i := 0; i < b.N; i++ {
for j := 0; j < len(buf); j++ {
_ = buf[j]
}
}
}
func BenchmarkMemoryWrite(b *testing.B) {
var buf [size]byte
b.ResetTimer()
for i := 0; i < b.N; i++ {
for j := 0; j < len(buf); j++ {
buf[j] = 1
}
}
}
随机读写
size=1024,1kB数据的随机读写
BenchmarkMemoryRead-16 5060062 239.3 ns/op
BenchmarkMemoryWrite-16 5161525 230.8 ns/op
差不多是4GB/s,相当快
连续读写 size=102410241024,也就是读写1GB数据:
BenchmarkMemoryRead-16 3 485632133 ns/op
BenchmarkMemoryWrite-16 2 504834850 ns/op
读写差不多2GB/s,还是很快的
SSD
测试代码:
const dir = "E:\test"
const size = 1024
func benchmarkDiskWrite(size int64, b *testing.B) {
tmpfile, err := ioutil.TempFile(dir, "example")
if err != nil {
b.Fatal(err)
}
defer os.Remove(tmpfile.Name())
buf := make([]byte, size)
b.ResetTimer()
for i := 0; i < b.N; i++ {
_, err := tmpfile.Write(buf)
if err != nil {
b.Fatal(err)
}
}
}
func benchmarkDiskRead(size int64, b *testing.B) {
tmpfile, err := ioutil.TempFile(dir, "example")
if err != nil {
b.Fatal(err)
}
defer os.Remove(tmpfile.Name())
buf := make([]byte, size)
if _, err := tmpfile.Write(buf); err != nil {
b.Fatal(err)
}
b.ResetTimer()
for i := 0; i < b.N; i++ {
_, err := tmpfile.Seek(0, 0)
if err != nil {
b.Fatal(err)
}
_, err = ioutil.ReadAll(tmpfile)
if err != nil {
b.Fatal(err)
}
}
}
func BenchmarkDiskWrite1KB(b *testing.B) { benchmarkDiskWrite(size, b) }
func BenchmarkDiskRead1KB(b *testing.B) { benchmarkDiskRead(size, b) }
笔记本一个杂牌512G固态
随机读写 还没找到合适的测试方法,很难量化。
连续读写 1GB
BenchmarkDiskWrite1KB-16 1 2166164800 ns/op
BenchmarkDiskRead1KB-16 1 1022825900 ns/op
差不多写是500MB/s,读是1GB/s
机械硬盘
笔记本一个杂牌1TB机械硬盘,2.5寸低转速的,还是type-c转接的。
随机读写 还没找到合适的测试方法,很难量化。
连续读写 1GB
BenchmarkDiskWrite1KB-16 1 10545889700 ns/op
BenchmarkDiskRead1KB-16 1 1036915000 ns/op
差不多写是100MB/s,读是1GB/s
总结
整体来说内存>SSD>机械 特别是随机读写,SSD和机械速度会很慢尽量避免,可以将一些随机读写,转化为一批顺序读写,会好很多。