我有一個關於文件IO(C語言)及其性能問題的問題。文件IO性能C
我有一個應用程序,它執行大量的文件I/O(在其生命週期〜3-6小時,大約0.5-0.75TB,主要是文件輸出)。 此刻,我的應用程序sprintf()
將所有內容都轉換爲char字符串,並在行尾write()
s處轉換爲file_descriptor。我的字符串長度爲1024個字符,但可以在64到1024之間任意變化。無論如何。
的問題是:
會更有意義做出更大的字符字符串(比如,1MB?)和sprintf()
一切都變成它做write()
過嗎?或者,假設緩衝由write()
負責處理,則直接跳過sprintf()
完全且僅僅是write()
更有意義?
東西我想過,但不確定是否會真正在性能方面一事無成:
如果我有,我存儲字符串,數字和字符串的各個部分,做的一個mem_copy結構結構呢?我猜測類似於二進制寫入?
我正試圖實現一種「緩衝」方法或任何可以最大限度提高性能的方法。 後者是我需要使用該文件進行進一步處理。 有什麼建議嗎?
編輯
我與printf(); + redir
和sprintf(); write();
我簡單地複製〜20GB到一個文件中的一些簡單的性能對比。
char string[1024];
for(i=0;i<(1<<20)*20;i++)
printf("%s",string);
~/tmp/tests$ time ./printf.out > testing
real 2m22.101s
user 0m28.214s
sys 0m29.294s
,而不是:
char string14[256]; ...etc
for(i=0;1<<(1<<20)*20;i++){
sprintf(dst_string,"%s%s",dst_string, string14);
sprintf(dst_string,"%s%s",dst_string, string24);
sprintf(dst_string,"%s%s",dst_string, string34);
sprintf(dst_string,"%s%s",dst_string, string44);
write(fd, dst_string, 1024);
}
~/tmp/tests$ time ./write.out
real 1m48.206s
user 0m58.544s
sys 0m41.079s
其原因多的sprintf()s是模擬禁止複製>緩衝液,然後寫入緩衝器。 時間(真正的反正)並不像一些評論所暗示的那麼微不足道。當然這是一個簡單的例子,也許在計算方案+ IO也許它不會。
在printf例子中,我有點困惑,那些額外的時間去了哪裏?用戶+系統不加起來真的,他們不應該至少在球場?因爲整個1:30m失蹤。
此測試是否顯示任何結論? sprintf +寫入>只需打印+ redir?
無論如何,謝謝大家的意見。
僅僅使用'printf'可能(幾乎可以肯定)比'sprintf'好,接着'write'。 –
你不應該假設緩衝由'write'來處理。事實上,你應該假設'write'根本就沒有緩衝。 –
但這會寫入標準輸出,我不得不重定向它,這是緩慢的,由終端限制,不是嗎?哦,我沒有fprintf可用。 – janjust