Go_18: Golang 中三种读取文件发放性能对比
Golang 中读取文件大概有三种方法,分别为:
1. 通过原生态 io 包中的 read 方法进行读取
2. 通过 io/ioutil 包提供的 read 方法进行读取
3. 通过 bufio 包提供的 read 方法进行读取
下面通过代码来验证这三种方式的读取性能,并总结出我们平时应该使用的方案,以便我们可以写出最优代码:
package main import (
"os"
"io"
"bufio"
"io/ioutil"
"time"
"log"
) func readCommon(path string) {
file, err := os.Open(path)
if err != nil {
panic(err)
}
defer file.Close() buf := make([]byte, )
for {
readNum, err := file.Read(buf)
if err != nil && err != io.EOF {
panic(err)
}
if == readNum {
break
}
}
} func readBufio(path string) {
file, err := os.Open(path)
if err != nil {
panic(err)
}
defer file.Close() bufReader := bufio.NewReader(file)
buf := make([]byte, ) for {
readNum, err := bufReader.Read(buf)
if err != nil && err != io.EOF {
panic(err)
}
if == readNum {
break
}
}
} func readIOUtil(path string) {
file, err := os.Open(path)
if err != nil {
panic(err)
}
defer file.Close()
_, err = ioutil.ReadAll(file)
} func main() {
//size is 26MB
pathName := "/Users/mfw/Desktop/shakespeare.json"
start := time.Now()
readCommon(pathName)
timeCommon := time.Now()
log.Printf("read common cost time %v\n", timeCommon.Sub(start)) readBufio(pathName)
timeBufio := time.Now()
log.Printf("read bufio cost time %v\n", timeBufio.Sub(timeCommon)) readIOUtil(pathName)
timeIOUtil := time.Now()
log.Printf("read ioutil cost time %v\n", timeIOUtil.Sub(timeBufio))
}
以上代码运行结果打印如下:
2017/05/11 19:23:46 read common cost time 25.584882ms
2017/05/11 19:23:46 read bufio cost time 11.857878ms
2017/05/11 19:23:46 read ioutil cost time 35.033003ms
再运行一次打印的结果如下:
2017/05/11 21:59:11 read common cost time 32.374922ms
2017/05/11 21:59:11 read bufio cost time 12.155643ms
2017/05/11 21:59:11 read ioutil cost time 27.193033ms
再多运行几次,发现 readCommon 和 readIOUtil 运行时间相差不大,通过查看源代码发现 io/ioutil 包其实就是封装了 io 包中的方法,故他们两没有性能优先之说;但是不管你运行多少次,readBufio 耗费时间是他们两各自所耗费时间一半左右。
由此可见性能最好的是通过带有缓冲的 io 流来读取文件性能最佳。
Go_18: Golang 中三种读取文件发放性能对比的更多相关文章
- Golang 中三种读取文件发放性能对比
Golang 中读取文件大概有三种方法,分别为: 1. 通过原生态 io 包中的 read 方法进行读取 2. 通过 io/ioutil 包提供的 read 方法进行读取 3. 通过 bufio 包提 ...
- java中三种for循环之间的对比
普通for循环语法: for (int i = 0; i < integers.length; i++) { System.out.println(intergers[i]); } foreac ...
- 深入了解三种针对文件(JSON、XML与INI)的配置源
深入了解三种针对文件(JSON.XML与INI)的配置源 物理文件是我们最常用到的原始配置的载体,最佳的配置文件格式主要由三种,它们分别是JSON.XML和INI,对应的配置源类型分别是JsonCon ...
- iOS开发UI篇—iOS开发中三种简单的动画设置
iOS开发UI篇—iOS开发中三种简单的动画设置 [在ios开发中,动画是廉价的] 一.首尾式动画 代码示例: // beginAnimations表示此后的代码要“参与到”动画中 [UIView b ...
- C#中三种定时器对象的比较
·关于C#中timer类 在C#里关于定时器类就有3个1.定义在System.Windows.Forms里2.定义在System.Threading.Timer类里3.定义在System.Timers ...
- 转-Web Service中三种发送接受协议SOAP、http get、http post
原文链接:web服务中三种发送接受协议SOAP/HTTP GET/HTTP POST 一.web服务中三种发送接受协议SOAP/HTTP GET/HTTP POST 在web服务中,有三种可供选择的发 ...
- C#中三种定时器对象的比较 【转】
https://www.cnblogs.com/zxtceq/p/5667281.html C#中三种定时器对象的比较 ·关于C#中timer类 在C#里关于定时器类就有3个1.定义在System.W ...
- Spring中三种配置Bean的方式
Spring中三种配置Bean的方式分别是: 基于XML的配置方式 基于注解的配置方式 基于Java类的配置方式 一.基于XML的配置 这个很简单,所以如何使用就略掉. 二.基于注解的配置 Sprin ...
- Android中三种超实用的滑屏方式汇总(转载)
Android中三种超实用的滑屏方式汇总 现如今主流的Android应用中,都少不了左右滑动滚屏这项功能,(貌似现在好多人使用智能机都习惯性的有事没事的左右滑屏,也不知道在干什么...嘿嘿),由于 ...
随机推荐
- TeamWork#3,Week5,Performance Test of Crawlers
爬虫总体性能不错,能完成基本的网络数据爬取,没有功能上的缺陷.下图为饿了么网站商户信息爬取结果及原网站信息. 大部分信息是正确的,但也有一些错误.比如下图,小渝馆家常菜和渝码头川菜位置爬取错了. 再比 ...
- BugPhobia开发篇章:Alaph阶段Scurm Meeting
[github] https://github.com/bugphobia/XuebaOnline 0x01 :目录与摘要 If you weeped for the missing sunset ...
- java程序设计课程实验报告3
北京电子科技学院(BESTI) 实 验 报 告 课程:java程序设计 班级:1353 姓名:陈都 学号:20135328 成绩: 指导教师:娄 ...
- An internal error occurred during: "Launching MVC on Tomcat 7.x".
删除工作空间下的“/.metadata/.plugins/org.eclipse.core.runtime/.settings/com.genuitec.eclipse.ast.deploy.core ...
- Codeforces Round #299 (Div. 2) D. Tavas and Malekas kmp
题目链接: http://codeforces.com/problemset/problem/535/D D. Tavas and Malekas time limit per test2 secon ...
- BZOJ 3132(上帝造题的七分钟-树状数组求和+2D逆求和数组)
3132: 上帝造题的七分钟 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 46 Solved: 18[Submit][Status][Discus ...
- PROFIBUS-DP现场总线的结构及应用
PROFIBUS的最大优点在于具有稳定的国际标准EN50170作保证,并经实际应用验证具有普遍性.目前已广泛应用于制造业自动化.流程工业自动化和楼宇.交通电力等领域. PROFIBUS由3个兼容部分组 ...
- debug阶段贡献分
组名: 新蜂 组长: 武志远 组员: 宫成荣 谢孝淼 杨柳 李峤 项目名称: java俄罗斯方块NEO 发布时间:11.29 武志远 武志远 武志远 武志远 武志远 宫成荣 宫成荣 杨柳 宫成荣 宫成 ...
- SQL Server 中几个有用的特殊函数
在SQL Server 的使用过程中,发现几个很有用,但不太常用(或细节不太清楚)的函数(存储过程): isnumeric,isdate,patindex,newid,collate,sp_execu ...
- php父级目录文件包函问题
问题: php子目录不能包函父目录中的文件. 环境: 网站根目录:/var/www/html/ PHP版本: 5.3.3 Apache版本:2.2 好了,创建三个文件: //文件路径:/var/www ...