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. 最纯粹的直播技术实战02-Camera的处理以及推流

    最纯粹的直播技术实战02-Camera的处理以及推流 最新实战教程.Android自己主动化刷量.作弊与防作弊.案例:刷友盟统计.批量注冊苹果帐号 这个系列的文章将会研究最纯粹的Android直播的实 ...

  2. ADO.NET数据库编程

    ADO.NET数据库编程 1.ADO.NET的相关概念. Microsoft的新一代技术,是ADO组件的后继者. 主要目的是在.NET Framework平台存取数据. 提供一致的对象模型,可以存取和 ...

  3. LTP4J的使用BUG及解决方案

    子墨子曾经曰过,LTP是个好模型! car老师oneplus还有bhan开发的LTP4J是个很好的项目,使用起来也非常方便,下面贴几个常见的错误使用引起的bug的log分析 1.现象描述:程序中断,生 ...

  4. 深入学习QWidget-1

    1.QWidget对事件的抓取和放手.主要有例如以下几个接口 grabGesture 抓取输入手势 ungrabGesture 取消抓取手势 grabKeyboard 抓取键盘输入 grabMouse ...

  5. 【Raspberry pi】GPIO注意事项

    1.GPIO编码的方法 第三列是树莓派板子上的自然编号(左边引脚为1-15,右边引脚为2-26),RPi.GPIO.setmode(GPIO.BOARD)采用这列编号 树莓派主芯片提供商Broadco ...

  6. boost实用工具:assign库了解学习

    许多时候,我们需要为容器初始化或者赋值,填入大量的数据; STL容器仅提供了容纳这些数据的方法,但是填充的步骤是相当地麻烦(insert.push_back); 于是,boost::assign出现了 ...

  7. Linux shell(. /path/filename)

    在 /etc/profile 文件中,有一段脚本: if [ -f /etc/bash.bashrc ]; then . /etc/bash.bashrc fi 这里的 “点号 + 空格 + 文件” ...

  8. SmartStoreNet解图

    概述: Ioc: Autofac 1. 通过继承, 对MVC的Controller的加强.

  9. NEU710(wanghang走迷宫)

    题目链接:传送门 题目大意:给你一个图,要从起点走到终点并且要吃够足够的金币才能出去,图上有金币(只能吃一次), 有传送门(用一次消耗1金币,必须有金币才能使用),问最少需要多少步才能出去.不能出去输 ...

  10. .net DataSet 导出到Excel

    public void CreateExcel(DataSet ds, string typeid, stringFileName)        {           HttpResponse r ...