2016-04-21 36 views
0

我希望編寫一個高效的C程序,它會生成一個文件的副本。似乎沒有執行此操作的功能(如rename)。我打算在stdio.h中使用fscanffprintf,但是他們的描述並沒有說明如何或如何對它們進行緩衝。它們是否緩衝在不同的緩存級別之間? (我假設磁盤到內存緩衝區由操作系統處理)fscanf和fprintf緩存在C中嗎?

回答

1

當您使用fopen打開文件時,它將被完全緩衝。

使用setvbufreference),您可以在對文件執行任何其他操作之前更改緩衝區。

FILE對象上使用任何常規I/O函數都會利用緩衝。

如果你只是複製數據,你將會進行順序讀寫,並不一定需要緩衝。但要做到這一點,需要爲I/O操作選擇合適的塊大小。傳統上,這與磁盤扇區的大小(4096字節)有關,但該值不是未來的證明。 fopen使用的默認值是BUFSIZ

與任何優化一樣,構建實際測試來驗證您的性能增益(或損失)。

最後,爲了獲得最快的I/O,您可能必須使用特定於操作系統的API。 C I/O函數只是映射到這些API的一般情況,但可能存在您無法通過C庫進行控制的操作系統的特殊性能設置。在爲Windows編寫快速的AVI寫入程序時,我當然遇到了這個問題。使用特定於平臺的I/OI能夠實現磁盤的最大讀/寫速度:兩倍於緩衝I/O(<stdio.h>)或本機AVI API的速度,比傳統C無緩衝I/O快大約20% 。

0

printfscanf功能家族都是同一個緩衝「接口」的一部分。 man 3 stdio

標準I/O庫提供了一個簡單高效的緩衝 流I/O接口。輸入和輸出被映射爲邏輯數據流 ,並且物理I/O特徵被隱藏。下面列出了 函數和宏;更多的信息是 可從各個手冊頁獲得。

如果你想避免緩衝,你將不得不使用不同的C庫。