浅谈GoLang几种读文件方式的比较

 更新时间:2019年01月03日 11:40:02   作者:david_je   我要评论

这篇文章主要介绍了浅谈GoLang几种读文件方式的比较,一般来说常用的有三种。使用Read加上buffer,使用bufio库和ioutil 库,非常具有实用价值,需要的朋友可以参考下

GoLang提供了很多读文件的方式,一般来说常用的有三种。使用Read加上buffer,使用bufio库和ioutil 库。

那他们的效率如何呢?用一个简单的程序来评测一下:

package main 
 
import( 
  "fmt" 
  "os" 
  "flag" 
  "io" 
  "io/ioutil" 
  "bufio" 
  "time" 
) 
 
func read1(path string)string{ 
  fi,err := os.Open(path) 
  if err != nil{ 
    panic(err) 
  } 
  defer fi.Close() 
 
  chunks := make([]byte,1024,1024) 
  buf := make([]byte,1024) 
  for{ 
    n,err := fi.Read(buf) 
    if err != nil && err != io.EOF{panic(err)} 
    if 0 ==n {break} 
    chunks=append(chunks,buf[:n]...) 
    // fmt.Println(string(buf[:n])) 
  } 
  return string(chunks) 
} 
 
func read2(path string)string{ 
  fi,err := os.Open(path) 
  if err != nil{panic(err)} 
  defer fi.Close() 
  r := bufio.NewReader(fi) 
   
  chunks := make([]byte,1024,1024) 
    
  buf := make([]byte,1024) 
  for{ 
    n,err := r.Read(buf) 
    if err != nil && err != io.EOF{panic(err)} 
    if 0 ==n {break} 
    chunks=append(chunks,buf[:n]...) 
    // fmt.Println(string(buf[:n])) 
  } 
  return string(chunks) 
} 
 
func read3(path string)string{ 
  fi,err := os.Open(path) 
  if err != nil{panic(err)} 
  defer fi.Close() 
  fd,err := ioutil.ReadAll(fi) 
  // fmt.Println(string(fd)) 
  return string(fd) 
} 
 
func main(){ 
   
  flag.Parse() 
  file := flag.Arg(0) 
  f,err := ioutil.ReadFile(file) 
  if err != nil{ 
    fmt.Printf("%s\n",err) 
    panic(err) 
  } 
  fmt.Println(string(f)) 
  start := time.Now() 
  read1(file) 
  t1 := time.Now() 
  fmt.Printf("Cost time %v\n",t1.Sub(start)) 
  read2(file) 
  t2 := time.Now() 
  fmt.Printf("Cost time %v\n",t2.Sub(t1)) 
  read3(file) 
  t3 := time.Now() 
  fmt.Printf("Cost time %v\n",t3.Sub(t2)) 
 
} 

运行命令go run read.go filename, 制定需要读取的文件就可以了。这里我比较了读取13.7MB的日志文件,三种方式分别消耗的时间是:

Cost time 105.006ms 
Cost time 68.0039ms 
Cost time 31.0018ms 

读取29.3MB的媒体文件:

Cost time 390.0223ms 
Cost time 194.0111ms 
Cost time 83.0048ms 

读取302MB的媒体文件

Cost time 40.8043338s 
Cost time 1m5.0407201s 
Cost time 8.8155043s 

这个差距就很明显了,ioutil提供的方法效率就是高。有空可以再从代码层面再去分析一下。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Go语言排序算法之插入排序与生成随机数详解

    Go语言排序算法之插入排序与生成随机数详解

    从这篇文章开始将带领大家学习Go语言的经典排序算法,比如插入排序、选择排序、冒泡排序、希尔排序、归并排序、堆排序和快排,二分搜索,外部排序和MapReduce等,本文将先详细介绍插入排序,并给大家分享了go语言生成随机数的方法,下面来一起看看吧。
    2017-11-11
  • Go语言算法之寻找数组第二大元素的方法

    Go语言算法之寻找数组第二大元素的方法

    这篇文章主要介绍了Go语言算法之寻找数组第二大元素的方法,以实例形式分析了不排序、只循环一次来实现寻找数组第二大元素的技巧,是比较典型的算法,需要的朋友可以参考下
    2015-02-02
  • 用gomock进行mock测试的方法示例

    用gomock进行mock测试的方法示例

    go-mock是专门为go语言开发的mock库,该库使用方式简单,支持自动生成代码,这篇文章主要介绍了用gomock进行mock测试的方法示例,感兴趣的小伙伴们可以参考一下
    2018-11-11
  • golang如何使用struct的tag属性的详细介绍

    golang如何使用struct的tag属性的详细介绍

    这篇文章主要介绍了golang如何使用struct的tag属性的详细介绍,从例子说起,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • go 代码的调试---打印调用堆栈的实例

    go 代码的调试---打印调用堆栈的实例

    下面小编就为大家带来一篇go 代码的调试---打印调用堆栈的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • golang如何修改json文件内容的方法示例

    golang如何修改json文件内容的方法示例

    这篇文章主要介绍了golang如何修改json文件内容的方法示例,使用一个例子说明golang如何访问和修改json文件,有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-10-10
  • Go JSON编码与解码的实现

    Go JSON编码与解码的实现

    这篇文章主要介绍了Go JSON编码与解码的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • 详解 Go 语言中 Map 类型和 Slice 类型的传递

    详解 Go 语言中 Map 类型和 Slice 类型的传递

    这篇文章主要介绍了详解 Go 语言中 Map 类型和 Slice 类型的传递的相关资料,需要的朋友可以参考下
    2017-09-09
  • Go语言实现AzDG可逆加密算法实例

    Go语言实现AzDG可逆加密算法实例

    这篇文章主要介绍了Go语言实现AzDG可逆加密算法,实例分析了AzDG可逆加密算法的实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-02-02
  • 基于golang时间转换的问题

    基于golang时间转换的问题

    下面小编就为大家带来一篇基于golang时间转换的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08

最新评论