Go语言写文件几种方式性能对比

Posted Golang语言社区

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go语言写文件几种方式性能对比相关的知识,希望对你有一定的参考价值。

Go语言中写文件有多种方式,这里进行如下几种方式的速度对比:

打开文件,写入内容,关闭文件。如此重复多次

打开文件,写入内容,defer 关闭文件。如此重复多次

打开文件,重复多次写入内容,defer 关闭文件

在VMWare下的Ubuntu 14.04下运行的结果表明:

方式1速度最慢,但是慢的很稳定

方式2比方式1略快,但是重复次数多了后会报错,应该是defer被压栈太多导致系统撑不了太多打开的文件

方式3速度约是前两者的2倍,因为减少了很多打开关闭文件的操作

测试代码如下:

package main
import (    "fmt"
   "os"
   "time")
func benchmarkFileWrite(filename string, n int, index int) (d time.Duration) {
   v := "ni shuo wo shi bu shi tai wu liao le a?"
   os.Remove(filename)
   t0 := time.Now()    switch index {    case 0: // open file and write, then close, repeat n times
       for i := 0; i < n; i++ {
           file, err := os.OpenFile(filename, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0666)            if err != nil {
               fmt.Println(index, i, "open file failed.", err.Error())                break
           }
           file.WriteString(v)
           file.WriteString("\n")
           file.Close()
       }    case 1: // open file and write, defer close, repeat n times
       for i := 0; i < n; i++ {
           file, err := os.OpenFile(filename, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0666)            if err != nil {
               fmt.Println(index, i, "open file failed.", err.Error())                break
           }
           defer file.Close()
           file.WriteString(v)
           file.WriteString("\n")
       }    case 2: // open file and write n times, then close file
       file, err := os.OpenFile(filename, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0666)        if err != nil {
           fmt.Println(index, "open file failed.", err.Error())            break
       }
       defer file.Close()        for i := 0; i < n; i++ {
           file.WriteString(v)
           file.WriteString("\n")
       }
   }
   t1 := time.Now()
   d = t1.Sub(t0)
   fmt.Printf("time of way(%d)=%v\n", index, d)    return d
}
func main() {    const k, n int = 3, 1000
   d := [k]time.Duration{}    for i := 0; i < k; i++ {
       d[i] = benchmarkFileWrite("benchmarkFile.txt", n, i)
   }    for i := 0; i < k-1; i++ {
       fmt.Printf("way %d cost time is %6.1f times of way %d\n", i, float32(d[i])/float32(d[k-1]), k-1)
   }
}

当n=1000时,测试结果如下

  time of way(0)=38.719386ms
 time of way(1)=31.428677ms
 time of way(2)=17.930829ms
 way 0 cost time is    2.2 times of way 2
 way 1 cost time is    1.8 times of way 2

当n=5000时,测试结果如下(因为方式1报错,所以它的时间是错的)

  time of way(0)=170.003521ms  1 1021 open file failed. open benchmarkFile.txt: too many open files
 time of way(1)=32.388994ms
 time of way(2)=77.777936ms
 way 0 cost time is    2.2 times of way 2
 way 1 cost time is    0.4 times of way 2

本文来自:博客园

查看原文:[笔记]Go语言写文件几种方式性能对比


以上是关于Go语言写文件几种方式性能对比的主要内容,如果未能解决你的问题,请参考以下文章

GO语言与C#代码行数对比

求斐波那契数列第n位的几种实现方式及性能对比(c#语言)

go语言读写文件的几种方式

几种常见的java网页静态化技术对比

我的Go+语言初体验——语法验证/性能测试篇(直男程序员的真实体验)

Go_18: Golang 中三种读取文件发放性能对比