最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談GoLang幾種讀文件方式的比較

 更新時(shí)間:2019年01月03日 11:40:02   作者:david_je  
這篇文章主要介紹了淺談GoLang幾種讀文件方式的比較,一般來(lái)說(shuō)常用的有三種。使用Read加上buffer,使用bufio庫(kù)和ioutil 庫(kù),非常具有實(shí)用價(jià)值,需要的朋友可以參考下

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)

    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
  • go mod 依賴(lài)管理的具體使用

    go mod 依賴(lài)管理的具體使用

    在Go語(yǔ)言開(kāi)發(fā)中,依賴(lài)管理是一項(xiàng)非常重要的工作,Go mod作為官方的包管理工具已經(jīng)成為了Go語(yǔ)言依賴(lài)管理的首選方式,本文就來(lái)介紹一下go mod 依賴(lài)管理的具體使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • GoLand如何設(shè)置中文

    GoLand如何設(shè)置中文

    這篇文章主要介紹了GoLand如何設(shè)置中文,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • go語(yǔ)言中的協(xié)程詳解

    go語(yǔ)言中的協(xié)程詳解

    本文詳細(xì)講解了go語(yǔ)言中的協(xié)程,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • go切片的copy和view的使用方法

    go切片的copy和view的使用方法

    這篇文章主要介紹了go切片的copy和view的使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • GoLang sync.Pool簡(jiǎn)介與用法

    GoLang sync.Pool簡(jiǎn)介與用法

    這篇文章主要介紹了GoLang sync.Pool簡(jiǎn)介與用法,Pool是可伸縮、并發(fā)安全的臨時(shí)對(duì)象池,用來(lái)存放已經(jīng)分配但暫時(shí)不用的臨時(shí)對(duì)象,通過(guò)對(duì)象重用機(jī)制,緩解GC壓力,提高程序性能
    2023-01-01
  • 淺談golang package中init方法的多處定義及運(yùn)行順序問(wèn)題

    淺談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é)程的方法詳解

    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ǔ)到高階解析Go語(yǔ)言中數(shù)組的應(yīng)用

    在本文中,我們將從基礎(chǔ)概念、常規(guī)操作,到高級(jí)技巧和特殊操作,帶大家深入了解Go語(yǔ)言中數(shù)組的各個(gè)方面,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-10-10
  • 使用go連接clickhouse的實(shí)戰(zhàn)操作

    使用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

最新評(píng)論

蒙山县| 神农架林区| 佳木斯市| 米易县| 日土县| 绥德县| 香格里拉县| 始兴县| 通榆县| 白水县| 樟树市| 塔河县| 麻江县| 佳木斯市| 吉隆县| 开原市| 凤庆县| 黎川县| 张家口市| 台山市| 巴青县| 体育| 诸城市| 尉犁县| 吉安县| 靖西县| 泸定县| 盈江县| 赫章县| 庆城县| 博客| 武威市| 屏东县| 互助| 新干县| 石狮市| 平湖市| 高台县| 汝城县| 茶陵县| 大冶市|