浅谈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提供的方法效率就是高。有空可以再从代码层面再去分析一下。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
下一篇: 第十二课 CSS基本选择器 css学习2