GoLang几种读文件方式的比较

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

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

 

    

Go代码   收藏代码
  1. package main  
  2.   
  3. import(  
  4.     "fmt"  
  5.     "os"  
  6.     "flag"  
  7.     "io"  
  8.     "io/ioutil"  
  9.     "bufio"  
  10.     "time"  
  11. )  
  12.   
  13. func read1(path string)string{  
  14.     fi,err := os.Open(path)  
  15.     if err != nil{  
  16.         panic(err)  
  17.     }  
  18.     defer fi.Close()  
  19.   
  20.     chunks := make([]byte,1024,1024)  
  21.     buf := make([]byte,1024)  
  22.     for{  
  23.         n,err := fi.Read(buf)  
  24.         if err != nil && err != io.EOF{panic(err)}  
  25.         if 0 ==n {break}  
  26.         chunks=append(chunks,buf[:n]...)  
  27.         // fmt.Println(string(buf[:n]))  
  28.     }  
  29.     return string(chunks)  
  30. }  
  31.   
  32. func read2(path string)string{  
  33.     fi,err := os.Open(path)  
  34.     if err != nil{panic(err)}  
  35.     defer fi.Close()  
  36.     r := bufio.NewReader(fi)  
  37.       
  38.     chunks := make([]byte,1024,1024)  
  39.        
  40.     buf := make([]byte,1024)  
  41.     for{  
  42.         n,err := r.Read(buf)  
  43.         if err != nil && err != io.EOF{panic(err)}  
  44.         if 0 ==n {break}  
  45.         chunks=append(chunks,buf[:n]...)  
  46.         // fmt.Println(string(buf[:n]))  
  47.     }  
  48.     return string(chunks)  
  49. }  
  50.   
  51. func read3(path string)string{  
  52.     fi,err := os.Open(path)  
  53.     if err != nil{panic(err)}  
  54.     defer fi.Close()  
  55.     fd,err := ioutil.ReadAll(fi)  
  56.     // fmt.Println(string(fd))  
  57.     return string(fd)  
  58. }  
  59.   
  60. func main(){  
  61.      
  62.     flag.Parse()  
  63.     file := flag.Arg(0)  
  64.     f,err := ioutil.ReadFile(file)  
  65.     if err != nil{  
  66.         fmt.Printf("%s\n",err)  
  67.         panic(err)  
  68.     }  
  69.     fmt.Println(string(f))  
  70.     start := time.Now()  
  71.     read1(file)  
  72.     t1 := time.Now()  
  73.     fmt.Printf("Cost time %v\n",t1.Sub(start))  
  74.     read2(file)  
  75.     t2 := time.Now()  
  76.     fmt.Printf("Cost time %v\n",t2.Sub(t1))  
  77.     read3(file)  
  78.     t3 := time.Now()  
  79.     fmt.Printf("Cost time %v\n",t3.Sub(t2))  
  80.   
  81. }  

 

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

   

Go代码   收藏代码
  1. Cost time 105.006ms  
  2. Cost time 68.0039ms  
  3. Cost time 31.0018ms  

   

   读取29.3MB的媒体文件:

    

Go代码   收藏代码
  1. Cost time 390.0223ms  
  2. Cost time 194.0111ms  
  3. Cost time 83.0048ms  

 

    读取302MB的媒体文件

   

Go代码   收藏代码
  1. Cost time 40.8043338s  
  2. Cost time 1m5.0407201s  
  3. Cost time 8.8155043s  

  

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

  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值