欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-10-11 14:55:57
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提供的方法效率就是高。有空可以再从代码层面再去分析一下。

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