簡體   English   中英

直接從FILE緩沖區讀取

[英]Reading directly from a FILE buffer

我的應用程序的核心大致如下所示:

size_t bufsize;
char*  buf1;
size_t r1; 
FILE* f1=fopen("/path/to/file","rb");
...
do{
  r1=fread(buf1, 1, bufsize, f1);
  processChunk(buf1,r1);
} while (!feof(f1));
...

(實際上,我有多個FILE*和多個bufN 。)現在,我聽說FILE已經准備好完全自己管理緩沖區(稱為“流緩沖區” ),並且此行為似乎相當可調整: https ://www.gnu.org/software/libc/manual/html_mono/libc.html#Controlling-Buffering。

如何重構上面的代碼以buf1緩沖區並改用f1的內部流緩沖區(同時將其設置為bufsize )?

如果您不希望使用不透明的緩沖I / O,請不要使用FILE * 使用低級API,讓您自己管理所有應用程序端緩沖,例如普通的POSIX open()read()

因此,我閱讀了一些C標准並運行了一些基准測試,這是我的發現:

1)像上面的示例中那樣做確實涉及不必要的內存中復制,這使基於上面的示例的簡單cmp程序的用戶時間增加了大約兩倍。 但是,對於大多數IO繁重的程序而言,用戶時間微不足道,除非文件源非常快。 但是,在內存文件源(Linux上為/dev/shm )上,關閉FILE緩沖( setvbuf(f1, NULL, _IONBF, 0); )確實會產生約10%至15%的良好且一致的速度提高。我的機器在使用接近BUFSIZ buffsize時(再次,基於上面提到的代碼段,是在IO密集型cmp實用程序上測量的,我已經提到過,我已經對2個相同的700MB文件進行了1​​00次測試)。

2)盡管有一個用於設置FILE緩沖區的API,但我沒有找到任何標准化的API來讀取它,所以我將堅持使用經過驗證的真實方法,但是將FILE緩沖區關閉( setvbuf(f1, NULL, _IONBF, 0);

(但是我想我可以通過使用_IONBF模式選項(=關閉緩沖)將自己的緩沖區設置為FILE流緩沖區來解決我的問題,然后我可以通過FILE結構中的一些非標准化指針來訪問它。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM