2013-07-08 31 views
-1

我的os背景不強,有人可以提供一些示例(如果可能,請在Go中),爲什麼使用緩衝區很重要?使用緩衝區進行讀取和讀取操作示例Go

+0

這個問題有點微不足道,所以答案可能有點不明確:用戶緩衝加快速度。如果完成無緩衝的話,有些事情是「效率低下」或「做對的痛苦」。見例如打包bufio的例子。 – Volker

+0

謝謝@Volker。這是真的,我的問題是不確定的。但我從好奇心問這個問題,而不是真正的需要。我想學習新東西:) –

+0

@Sławosz:堆棧溢出問答格式適用於具有簡短事實答案的特定問題。例如:我正在順序閱讀一個大文件。我應該還是不應該讓Buffier I/O,爲什麼?你正在要求一個關於緩衝的論文。這要求太高了。 – peterSO

回答

6

假設你正在談論IO:

假設你有一個var fin *os.File和文件包裹在一個緩衝區,var instrm *bufio.Reader。現在想象你正在寫某種解析器,每次讀入輸入的一個字符(可以說字節)。包bufio實現緩衝I/O。

如果你打電話myParser.Parse(fin)你會打電話給.Read 4,194,304次讀取每個字節,這將使系統調用4,194,304次,這將導致4,194,304 context switchescontext switches是控制從用戶空間程序傳輸到OS並且是最慢(非IO)操作之一。在操作系統不合並/預取IO請求的情況下,您的IO設備一次也尋找並讀取一個字節的可能性也很大,但大多數操作系統的IO elevator預取和device-side buffers現在可以防止這種情況發生(但它總是更好大批量連續閱讀)。

如果您撥打myParser.Parse(instrm),默認bufio.Reader緩衝區爲4K,則將導致1,024個上下文切換(每個系統調用讀取4K而不是1個字節)。由於每個系統調用都有一定的開銷,這意味着花更少的時間用於進行系統調用,並且有更多的時間讓程序運行。同樣值得指出的是,以這種方式運行(沒有額外的上下文切換)通常會增加CPU instruction緩存命中率,因爲更多時間將用於branching within a smaller region of memory

緩衝區在網絡IO等領域更爲重要,因爲它將允許您發送最大數量的數據包,而不是發送小型數據包。

只是不要忘記刷新你的寫入緩衝區。