• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    浅谈GoLang几种读文件方式的比较

    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提供的方法效率就是高。有空可以再从代码层面再去分析一下。

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

    您可能感兴趣的文章:
    • 详解Golang编程中的常量与变量
    • Golang学习笔记(二):类型、变量、常量
    • GO语言中的常量
    • Go语言中常量定义方法实例分析
    • Go系列教程之反射的用法
    • GOLANG使用Context实现传值、超时和取消的方法
    • GOLANG使用Context管理关联goroutine的方法
    • Go并发调用的超时处理的方法
    • Go routine调度详解
    • Golang常量iota的使用实例
    上一篇:golang实现LRU缓存淘汰算法的示例代码
    下一篇:Go routine调度详解
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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