Golang 逐行讀取大檔案效能對比

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

前 言

BUFIO 是什嗎?
BUFIO 是用來驅動 I/O 列內的專用時鐘網路,這個專用的時鐘網路獨立於全域時鐘資源,適合採集源同步資料。BUFIO 只能由位於同一時鐘地區的 Clock-Capable I/O驅動。一個時鐘地區有4個 BURIO,其中的2個可以驅動相鄰地區的 I/O 時鐘網路。BUFIO 不能驅動邏輯資源(CLB、BRAM等),因為 I/O 時鐘網路只存在於 I/O 列中。

簡單點就是:

  • bufio 包實現了帶緩衝的 I/O 操作

  • 它封裝一個 io.Reader 或 io.Writer 對象

  • 使其具有緩衝和一些文本讀寫功能

本文主要來對比一下 BUFIO 中的 ReadString 和 ReadLine 函數的效能。

註:測試代碼忽略讀取內容和錯誤處理

ReadString 函數

ReadString 代碼:

func ReadString(filename string) {    f, _ := os.Open(filename)    defer f.Close()    r := bufio.NewReader(f)    for {        _, err := r.ReadString('\n')         if err != nil {            break        }    }}

ReadLine 函數

ReadLine 代碼:

func ReadLine(filename string) {    f, _ := os.Open(filename)    defer f.Close()    r := bufio.NewReader(f)    for {        _, err := readLine(r)        if err != nil {            break        }    }}

此函數主要解決單行位元組數大於4096的情況

func readLine(r *bufio.Reader) (string, error) {    line, isprefix, err := r.ReadLine()    for isprefix && err == nil {        var bs []byte        bs, isprefix, err = r.ReadLine()        line = append(line, bs...)    }    return string(line), err}

注: 測試檔案 log 每行位元組數均大於4096

性 能 對 比

以上兩種方式分別讀取10G/20G/30G檔案的耗時如下:

讀取10G檔案耗時

readstring:30.717832767sreadline:27.358268244s

讀取20G檔案耗時

readstring:59.937901346sreadline:54.871384854s

**讀取30G檔案耗時******

readstring:1m21.657831495sreadline:1m13.222376352s

結 論

ReadLine 讀取檔案更快,原因是由於 ReadString 後端調用 ReadBytes,而 ReadBytes 多次使用 copy 方法造成大量耗時。

測試代碼如下:

package mainimport (    "bufio"    "fmt"    "os"    "time")
func main() {    filename := "./log"    s := time.Now()    ReadString(filename)    e1 := time.Now()    fmt.Printf("readstring:%v\n", e1.Sub(s))    ReadLine(filename)    e2 := time.Now()    fmt.Printf("readline:%v\n", e2.Sub(e1))}
func ReadString(filename string) {    f, _ := os.Open(filename)    defer f.Close()    r := bufio.NewReader(f)    for {        _, err := r.ReadString('\n') //忽略內容        if err != nil {            break        }    }}
func ReadLine(filename string) {    f, _ := os.Open(filename)    defer f.Close()    r := bufio.NewReader(f)    for {        _, err := readLine(r)        if err != nil {            break        }    }}
func readLine(r *bufio.Reader) (string, error) {    line, isprefix, err := r.ReadLine()    for isprefix && err == nil {        var bs []byte        bs, isprefix, err = r.ReadLine()        line = append(line, bs...)    }    return string(line), err}

技術交流QQ群:368573673

有興趣的可以關注我們的公眾號:Reboot51

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.