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

 更新时间:2019-04-17 21:47:12   作者:佚名   我要评论(0)

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

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

您可能感兴趣的文章:

  • 详解Golang编程中的常量与变量
  • Golang学习笔记(二):类型、变量、常量
  • GO语言中的常量
  • Go语言中常量定义方法实例分析
  • Go系列教程之反射的用法
  • GOLANG使用Context实现传值、超时和取消的方法
  • GOLANG使用Context管理关联goroutine的方法
  • Go并发调用的超时处理的方法
  • Go routine调度详解
  • Golang常量iota的使用实例

相关文章

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

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

    GoLang提供了很多读文件的方式,一般来说常用的有三种。使用Read加上buffer,使用bufio库和ioutil 库。 那他们的效率如何呢?用一个简单的程序来评测一下:
    2019-04-17
  • Golang常量iota的使用实例

    Golang常量iota的使用实例

    Codes package main import "fmt" type color byte const ( black color = iota red blue ) func test(c color) { fmt.Println(c) } func main() {
    2019-04-17
  • golang实现跨域访问的方法

    golang实现跨域访问的方法

    前端通过Ajax来获取服务器资源时,会存在跨域问题。因为Ajax只能同源使用(预防某些恶意行为),所以当访问不在同一个域中的资源时,就会出现跨域限制。尤其在
    2019-04-17
  • Linux中10个方便的Bash别名

    Linux中10个方便的Bash别名

    有多少次您在命令行上多次输入一个长命令,并希望有一种方法将其保存到以后?这就是Bash别名派上用场的地方。它们允许您将长而神秘的命令浓缩成易于记忆和使用
    2019-04-17
  • 在Linux命令行中列出带有ls文件的技巧

    在Linux命令行中列出带有ls文件的技巧

    我在linux中学到的第一批命令之一是ls。了解系统上文件所在的目录中的内容很重要。不仅能看到和修改全的文件也很重要。 我的第一个linux备忘单是一页Linux手册
    2019-04-17
  • golang顺时针打印矩阵的方法示例

    golang顺时针打印矩阵的方法示例

    题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依
    2019-04-17
  • Golang 日期/时间包的使用详解

    Golang 日期/时间包的使用详解

    golang 的日期时间包:time 的使用方式。 time package 包含了 time.Time 时间对象 及 构建此时间对象的一些方法(time.Unix(), time.Parse()) golang 可
    2019-04-17
  • 关于Golang中range指针数据的坑详解

    关于Golang中range指针数据的坑详解

    前言 在Golang中使用 for range 语句进行迭代非常的便捷,但在涉及到指针时就得小心一点了。 下面的代码中定义了一个元素类型为 *int 的通道 ch : pac
    2019-04-17
  • 图解Golang的GC垃圾回收算法

    图解Golang的GC垃圾回收算法

    虽然Golang的GC自打一开始,就被人所诟病,但是经过这么多年的发展,Golang的GC已经改善了非常多,变得非常优秀了。 以下是Golang GC算法的里程碑: v1.1
    2019-04-17
  • Go语言字符串高效拼接的实现

    Go语言字符串高效拼接的实现

    +号拼接 这种拼接最简单,也最容易被我们使用,因为它是不限编程语言的,比如Go语言有,Java也有,它们是+号运算符,在运行时计算的。 var s string s+=
    2019-04-17

最新评论