【Go语言测评】内存与磁盘读写速度差异对比

264 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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和机械速度会很慢尽量避免,可以将一些随机读写,转化为一批顺序读写,会好很多。