簡體   English   中英

使用二進制文件進行操作時fread / fwrite的性能

[英]performance of fread/fwrite while doing operation with binary file

我正在通過fwrite將一些二進制數據寫入二進制文件,一旦寫完就通過fread讀回相同的數據。盡管這樣做,我發現fwrite花費更少的時間寫整個數據,而fread花費的時間更多時間讀取所有數據。 所以,我只想知道fwrite總是比fread花費更少的時間,或者我的閱讀部分有問題。

盡管,正如其他人所說,並不能保證,但是通常您會發現一次寫入比一次讀取要快。 寫操作可能會將數據復制到緩沖區中並立即返回,而讀操作可能會等待數據從存儲設備中獲取。 有時,如果緩沖區已滿,寫操作將很慢。 有時,如果已經獲取數據,讀取將很快。 有時, fread / fwrite與存儲硬件之間的許多抽象層之一將決定在沒有明顯原因的情況下進入自己的小世界。

C ++語言不能保證這些(或任何其他)函數的比較性能。 這完全取決於硬件和操作系統的組合,機器的負載以及月相。

這些功能與操作系統的文件系統緩存交互。 在許多情況下,它是簡單的內存到內存副本。 如果重復運行程序,則寫入速度確實確實會快一些。 它只需要在緩存中找到一個空洞即可轉儲其數據。 將數據刷新到磁盤的時間是您看不到或無法測量的。

通常需要閱讀更多的工作。 至少需要遍歷緩存結構,以發現磁盤數據是否已緩存。 如果不是這樣,將不得不阻止磁盤驅動器請求以從磁盤檢索數據,這將花費許多毫秒。

分析此行為的標准陷阱是從程序的重復運行中進行測量。 它們根本不能代表程序在野外的行為方式。 在程序的第二次運行中,磁盤數據已被緩存的幾率非常高 它們在現實生活中非常貧窮,讀取速度可能非常慢,尤其是第一次讀取時。 對於寫入存在一個額外的特殊陷阱,在某些時候(也取決於其他程序的行為),緩存將無法緩沖該寫入請求。 然后,由於程序被阻塞,直到將足夠的數據刷新到磁盤上時,寫入性能才會下降。

長話短說: 永遠不要假設磁盤讀/寫性能測量代表程序在生產中的行為。 也許還有更多要點:您無法采取任何措施來解決代碼中的磁盤I / O性能問題。

您會看到緩沖/緩存系統的效果,就像其他人所說的那樣,但是,如果您使用異步API(如您所說的對fread / write進行處理,則應查看aio_read / aio_write),則可以嘗試一些其他I / O可能會針對您的工作進行更好的優化。

一個建議是,如果您要讀取/更新/寫入/讀取大量文件,則應通過ioctl或DeviceIOControl向操作系統請求,以向您提供運行代碼的磁盤的幾何形狀,然后確定磁盤cylander的大小,因此您可以確定是否可以在單個柱面中緩沖進行讀/寫操作。 這樣,驅動器磁頭將不會為您的讀/寫操作而移動,並為您節省了大量的運行時間。

暫無
暫無

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

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