[英]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文件進行了100次測試)。
2)盡管有一個用於設置FILE
緩沖區的API,但我沒有找到任何標准化的API來讀取它,所以我將堅持使用經過驗證的真實方法,但是將FILE
緩沖區關閉( setvbuf(f1, NULL, _IONBF, 0);
)
(但是我想我可以通過使用_IONBF模式選項(=關閉緩沖)將自己的緩沖區設置為FILE流緩沖區來解決我的問題,然后我可以通過FILE結構中的一些非標准化指針來訪問它。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.