浅谈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提供的方法效率就是高。有空可以再从代码层面再去分析一下。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。