浅谈GoLang几种读文件方式的比较
GoLang提供了很多读文件的方式,一般来说常用的有三种。使用Read加上buffer,使用bufio库和ioutil库。
那他们的效率如何呢?用一个简单的程序来评测一下:
packagemain
import(
"fmt"
"os"
"flag"
"io"
"io/ioutil"
"bufio"
"time"
)
funcread1(pathstring)string{
fi,err:=os.Open(path)
iferr!=nil{
panic(err)
}
deferfi.Close()
chunks:=make([]byte,1024,1024)
buf:=make([]byte,1024)
for{
n,err:=fi.Read(buf)
iferr!=nil&&err!=io.EOF{panic(err)}
if0==n{break}
chunks=append(chunks,buf[:n]...)
//fmt.Println(string(buf[:n]))
}
returnstring(chunks)
}
funcread2(pathstring)string{
fi,err:=os.Open(path)
iferr!=nil{panic(err)}
deferfi.Close()
r:=bufio.NewReader(fi)
chunks:=make([]byte,1024,1024)
buf:=make([]byte,1024)
for{
n,err:=r.Read(buf)
iferr!=nil&&err!=io.EOF{panic(err)}
if0==n{break}
chunks=append(chunks,buf[:n]...)
//fmt.Println(string(buf[:n]))
}
returnstring(chunks)
}
funcread3(pathstring)string{
fi,err:=os.Open(path)
iferr!=nil{panic(err)}
deferfi.Close()
fd,err:=ioutil.ReadAll(fi)
//fmt.Println(string(fd))
returnstring(fd)
}
funcmain(){
flag.Parse()
file:=flag.Arg(0)
f,err:=ioutil.ReadFile(file)
iferr!=nil{
fmt.Printf("%s\n",err)
panic(err)
}
fmt.Println(string(f))
start:=time.Now()
read1(file)
t1:=time.Now()
fmt.Printf("Costtime%v\n",t1.Sub(start))
read2(file)
t2:=time.Now()
fmt.Printf("Costtime%v\n",t2.Sub(t1))
read3(file)
t3:=time.Now()
fmt.Printf("Costtime%v\n",t3.Sub(t2))
}
运行命令gorunread.gofilename,制定需要读取的文件就可以了。这里我比较了读取13.7MB的日志文件,三种方式分别消耗的时间是:
Costtime105.006ms Costtime68.0039ms Costtime31.0018ms
读取29.3MB的媒体文件:
Costtime390.0223ms Costtime194.0111ms Costtime83.0048ms
读取302MB的媒体文件
Costtime40.8043338s Costtime1m5.0407201s Costtime8.8155043s
这个差距就很明显了,ioutil提供的方法效率就是高。有空可以再从代码层面再去分析一下。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。