分享
  1. 首页
  2. 文章

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

journeyonmyway · · 9249 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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

  1. 打开文件,写入内容,关闭文件。如此重复多次
  2. 打开文件,写入内容,defer 关闭文件。如此重复多次
  3. 打开文件,重复多次写入内容,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

有疑问加站长微信联系(非本文作者)

本文来自:博客园

感谢作者:journeyonmyway

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

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
9249 次点击
1 回复 | 直到 2018年06月15日 09:20:12
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏