[笔记]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 : // 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语言写文件几种方式性能对比的更多相关文章
- [笔记]Go语言的字符串拼装方式性能对比
Go语言中字符串的拼装方法很多,那么问题来了,到底哪家性能好? 下面代码,分别比较了 fmt.Sprintf,string +,strings.Join,bytes.Buffer,方法是循环若干次比较 ...
- PHP/HTML混写的四种方式总结
PHP/HTML混写的四种方式总结 一.总结 一句话总结: 注意点: 1.双引号里面解析变量:echo "$Content" 2.HEREDOC和NOWDOC的关系:类似于双引号包 ...
- PHP/HTML混写的四种方式
[整理]PHP/HTML混写的四种方式 PHP作为一款后端语言,为了输出给浏览器让浏览器呈现出来,无可避免的要输出HTML代码,下文介绍下我用过的三种PHP/HTML混编方法 1.单/双引号包围法 ...
- Linux上删除大量文件几种方式对比
目录 Linux上删除大量文件几种方式对比 1. rm删除:因为文件数量太多,rm无法删除(报错) 2. find查找删除:-exec 3. find查找删除:xargs 4. find调用-dele ...
- 加载映射文件几种方式和mapper接口注解执行sql语句
一.加载映射文件几种方式 二.mapper接口注解执行sql语句 就将xml中的sql语句放到注解的括号中就可以,一般只用于简单的sql语句合适:
- java创建线程的三种方式及其对比
第一种方法:继承Thread类,重写run()方法,run()方法代表线程要执行的任务.第二种方法:实现Runnable接口,重写run()方法,run()方法代表线程要执行的任务.第三种方法:实现c ...
- AJPFX总结java创建线程的三种方式及其对比
Java中创建线程主要有三种方式: 一.继承Thread类创建线程类 (1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务.因此把run()方法称为执行 ...
- Java多线程1:使用多线程的几种方式以及对比
前言 Java多线程的使用有三种方法:继承Thread类.实现Runnable接口和使用Callable和Future创建线程,本文将对这三种方法一一进行介绍. 1.继承Thread类 实现方式很简单 ...
- React.js入门笔记 创建hello world 的6种方式
一.ReactJS简介 React 起源于 Facebook 的内部项目,因为该公司对市场上所有 JavaScript MVC 框架,都不满意,就决定自己写一套,用来架设 Instagram 的网站. ...
随机推荐
- python+pandas+openpyxl下载xls illegalCharacterError
仅仅是urllib2.unquote_plus解码是不够的,需要将特殊字符去掉 ILLEGAL_CHARACTERS_RE = re.compile(r'[\000-\010]|[\013-\014] ...
- pycharm重置设置,恢复默认设置
备忘,备忘,备忘 window 系统 找到下方目录-->删除. 再重新打开pycharm # Windows Vista, 7, 8, 10: <SYSTEM DRIVE>\User ...
- 下列哪一个接口定义了用于查找、创建和删除EJB实例
下列哪一个接口定义了用于查找.创建和删除EJB实例 A.Home B.Remote C.Local D.Message 解答:A remote接口定义了业务方法,用于EJB客户端调用业务方法. hom ...
- WPF验证之——必填验证
要事先必填验证,首先要重写ValidationRule类的Validate方法,然后在Binding中指定对应的ValidationRule. 第一步:重写ValidationRule的Validat ...
- 最简单的TabHost
创建一个项目.Tab继承自TabActivity. main.xml: <?xml version="1.0" encoding="utf-8"?> ...
- 浅析Java与C#的事件处理机制
http://www.cnblogs.com/OOAbooke/archive/2012/02/18/2356899.html
- DataContract 和 DataMember
数据契约(DataContract) 服务契约定义了远程访问对象和可供调用的方法,数据契约则是服务端和客户端之间要传送的自定义数据类型. 一旦声明一个类型为DataContract,那么该类型就可以被 ...
- java进阶-多线程学习笔记
多线程学习笔记 1.什么是线程 操作系统中 打开一个程序就是一个进程 一个进程可以创建多个线程 现在系统中 系统调度的最小单元是线程 2.多线程有什么用? 发挥多核CPU的优势 如果使用多线程 将计算 ...
- JavaWeb中文乱码问题解决思路
1.提交页面请求或者服务器端的响应时,需要确保页面编码当时与服务器编码方式是否一致. 2.对于从服务器写入数据库中的数据和从数据库中读取到服务器中的数据,需要确保服务器编码方式与数据库编码方式是否一致 ...
- Sql Server 数据库用Transact-SQL语句创建链接服务器
1.在查询编辑器中,输入以下 Transact-SQL 命令以便链接到名为 SRVR002\ACCTG 的 SQL Server 实例: USE [master] GO EXEC master.dbo ...