淺談GoLang幾種讀文件方式的比較
GoLang提供了很多讀文件的方式,一般來(lái)說(shuō)常用的有三種。使用Read加上buffer,使用bufio庫(kù)和ioutil 庫(kù)。
那他們的效率如何呢?用一個(gè)簡(jiǎn)單的程序來(lái)評(píng)測(cè)一下:
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))
}
運(yùn)行命令go run read.go filename, 制定需要讀取的文件就可以了。這里我比較了讀取13.7MB的日志文件,三種方式分別消耗的時(shí)間是:
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
這個(gè)差距就很明顯了,ioutil提供的方法效率就是高。有空可以再?gòu)拇a層面再去分析一下。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Golang 并發(fā)控制模型的實(shí)現(xiàn)
Go控制并發(fā)有三種經(jīng)典的方式,使用?channel?通知實(shí)現(xiàn)并發(fā)控制、使用 sync 包中的?WaitGroup?實(shí)現(xiàn)并發(fā)控制、使用?Context?上下文實(shí)現(xiàn)并發(fā)控制,下面就來(lái)介紹一下2024-08-08
淺談golang package中init方法的多處定義及運(yùn)行順序問(wèn)題
這篇文章主要介紹了淺談golang package中init方法的多處定義及運(yùn)行順序問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-05-05
Golang利用channel協(xié)調(diào)協(xié)程的方法詳解
go?當(dāng)中的并發(fā)編程是通過(guò)goroutine來(lái)實(shí)現(xiàn)的,利用channel(管道)可以在協(xié)程之間傳遞數(shù)據(jù),所以本文就來(lái)講講Golang如何利用channel協(xié)調(diào)協(xié)程吧2023-05-05
從基礎(chǔ)到高階解析Go語(yǔ)言中數(shù)組的應(yīng)用
在本文中,我們將從基礎(chǔ)概念、常規(guī)操作,到高級(jí)技巧和特殊操作,帶大家深入了解Go語(yǔ)言中數(shù)組的各個(gè)方面,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-10-10
使用go連接clickhouse的實(shí)戰(zhàn)操作
這篇文章主要給大家介紹了關(guān)于使用go連接clickhouse的實(shí)戰(zhàn)操作,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用go具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-03-03

