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 : // open file and write, then close, repeat n times
for i := ; i < n; i++ {
file, err := os.OpenFile(filename, os.O_WRONLY|os.O_APPEND|os.O_CREATE, )
if err != nil {
fmt.Println(index, i, "open file failed.", err.Error())
break
} file.WriteString(v)
file.WriteString("\n")
file.Close()
}
case : // open file and write, defer close, repeat n times
for i := ; i < n; i++ {
file, err := os.OpenFile(filename, os.O_WRONLY|os.O_APPEND|os.O_CREATE, )
if err != nil {
fmt.Println(index, i, "open file failed.", err.Error())
break
}
defer file.Close() file.WriteString(v)
file.WriteString("\n")
}
case : // open file and write n times, then close file
file, err := os.OpenFile(filename, os.O_WRONLY|os.O_APPEND|os.O_CREATE, )
if err != nil {
fmt.Println(index, "open file failed.", err.Error())
break
}
defer file.Close() for i := ; 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 = ,
d := [k]time.Duration{}
for i := ; i < k; i++ {
d[i] = benchmarkFileWrite("benchmarkFile.txt", n, i)
} for i := ; i < k-; i++ {
fmt.Printf("way %d cost time is %6.1f times of way %d\n", i, float32(d[i])/float32(d[k-]), k-)
}
}

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

  time of way()=.719386ms
time of way()=.428677ms
time of way()=.930829ms
way cost time is 2.2 times of way
way cost time is 1.8 times of way

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

  time of way()=.003521ms
open file failed. open benchmarkFile.txt: too many open files
time of way()=.388994ms
time of way()=.777936ms
way cost time is 2.2 times of way
way cost time is 0.4 times of way

[笔记]Go语言写文件几种方式性能对比的更多相关文章

  1. [笔记]Go语言的字符串拼装方式性能对比

    Go语言中字符串的拼装方法很多,那么问题来了,到底哪家性能好? 下面代码,分别比较了 fmt.Sprintf,string +,strings.Join,bytes.Buffer,方法是循环若干次比较 ...

  2. PHP/HTML混写的四种方式总结

    PHP/HTML混写的四种方式总结 一.总结 一句话总结: 注意点: 1.双引号里面解析变量:echo "$Content" 2.HEREDOC和NOWDOC的关系:类似于双引号包 ...

  3. PHP/HTML混写的四种方式

    [整理]PHP/HTML混写的四种方式   PHP作为一款后端语言,为了输出给浏览器让浏览器呈现出来,无可避免的要输出HTML代码,下文介绍下我用过的三种PHP/HTML混编方法 1.单/双引号包围法 ...

  4. Linux上删除大量文件几种方式对比

    目录 Linux上删除大量文件几种方式对比 1. rm删除:因为文件数量太多,rm无法删除(报错) 2. find查找删除:-exec 3. find查找删除:xargs 4. find调用-dele ...

  5. 加载映射文件几种方式和mapper接口注解执行sql语句

    一.加载映射文件几种方式 二.mapper接口注解执行sql语句 就将xml中的sql语句放到注解的括号中就可以,一般只用于简单的sql语句合适:

  6. java创建线程的三种方式及其对比

    第一种方法:继承Thread类,重写run()方法,run()方法代表线程要执行的任务.第二种方法:实现Runnable接口,重写run()方法,run()方法代表线程要执行的任务.第三种方法:实现c ...

  7. AJPFX总结java创建线程的三种方式及其对比

    Java中创建线程主要有三种方式: 一.继承Thread类创建线程类 (1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务.因此把run()方法称为执行 ...

  8. Java多线程1:使用多线程的几种方式以及对比

    前言 Java多线程的使用有三种方法:继承Thread类.实现Runnable接口和使用Callable和Future创建线程,本文将对这三种方法一一进行介绍. 1.继承Thread类 实现方式很简单 ...

  9. React.js入门笔记 创建hello world 的6种方式

    一.ReactJS简介 React 起源于 Facebook 的内部项目,因为该公司对市场上所有 JavaScript MVC 框架,都不满意,就决定自己写一套,用来架设 Instagram 的网站. ...

随机推荐

  1. windows 下安装securecrt 绿色版

  2. Android无线测试之—UiAutomator UiObject API介绍四

    输入文本与清除文本 一.输入文本与清除文本相关API 返回值 API 描述 boolean setText(String test) 在对象中输入文本 void clearTextField() 清除 ...

  3. iOS-本地沙盒路径

    沙盒几个路径: 沙盒里的文件夹包括Documents.Library.tmp.这三个文件夹的作用请点击这里.接下来我们来讲解如何获取Documents.Library.tmp的路径. 获取沙盒根目录 ...

  4. ios 统一设计,iOS6也玩扁平化

    转:http://esoftmobile.com/2014/01/14/build-ios6-ios7-apps/ 前言 前段时间,苹果在它的开发者网站上放出了iOS系统安装比例,其中iOS7占到78 ...

  5. [hihoCoder] 后序遍历

    The key of this problem is that we need not build the tree from scratch. In fact, we can direct obta ...

  6. 【谷歌浏览器】在任意页面运行JS

    1.使用谷歌浏览器的调试功能: 在任何页面上运行代码片段 · Chrome 开发者工具中文文档 注:比较简单,直接,不过只能本地执行,只能自己使用.且需自行保存JS文件: 2.使用油猴插件: Tamp ...

  7. Android异步处理之AsyncTaskLoader简单使用

    简介 不管是在Android应用开发还是Android平台开发中,异步处理通常是最基本的coding要求.如果你还在主线程中写一些数据库,网络请求,读写本地文件等操作的话那说明你还不是一个合格的And ...

  8. ChannelOption用到的socket的标准参数

    ChannelOption.SO_BACKLOG, 1024 BACKLOG用于构造服务端套接字ServerSocket对象,标识当服务器请求处理线程全满时,用于临时存放已完成三次握手的请求的队列的最 ...

  9. pug.compile() will compile the Pug source code into a JavaScript function that takes a data object (called “locals”) as an argument.

    Getting Started – Pug https://pugjs.org/api/getting-started.html GitHub - Tencent/wepy: 小程序组件化开发框架 h ...

  10. 目标探测:r-cnn, fast-rcnn, faster-rcnn, yolo, mask-rcnn

    目标探测:r-cnn, fast-rcnn, faster-rcnn, yolo, mask-rcnn 作者:尼箍纳斯凯奇 链接: https://www.zhihu.com/question/574 ...