簡體   English   中英

使用FILE *或std :: ifstream可以更快地讀取文件嗎?

[英]Will reading a file be faster with a FILE* or an std::ifstream?

當我使用std :: ofstream遇到問題時,我正在考慮這個問題。

我的想法是從std :: ifstream開始,它不支持隨機訪問。 相反,它只是從頭開始,一直流到您想要的部分。 這只是很快,所以我們沒有注意到嗎?

而且我很確定FILE *支持隨機訪問,所以這也會很快嗎?

ifstream支持使用seekg進行隨機訪問。 FILE *可能更快,但是您應該對其進行測量。

由於它們都暗示着系統調用,並且比其他操作要耗費數個數量級的時間,因此兩者的性能應該非常相似。

假設FILE *更快。 現在,您能給我一個很好的理由,為什么不應該在此方面實現std::ifstream 這意味着性能變得相似。

我將相反的情況(如果std::ifstream更快)留給讀者練習(提示,那里的情況也是如此)。

在擔心性能之前,您應該始終牢記一條經驗法則:

編寫您語言的標准庫的人至少有4個正常的大腦細胞。 他們不是愚蠢的。

這意味着,如果可以根據特征Y輕松實現特征X,則X不會比Y明顯慢。

如果在標准輸入或輸出上運行速度比較,請記住之前調用std::ios_base::sync_with_stdio(false) 當此設置為true ,將完成所有操作,以便從std::cin讀取與fgets(stdin)相同的緩沖區中的數據。 將其設置為false可為iostream提供更多的自由度和更少的簿記。

請記住,隨機I / O將破壞底層API中完成的所有緩存。 而且,無論使用哪種機制(假定文件大小很大),直到到達特定位置都比查找要快得多。

我在這里與stribika在一起:測量然后做出決定。

std::ifstreamFILE的包裝器,因此前者沒有后者快。 它們的差異取決於編譯器以及它是否可以內聯包裝函數調用並執行其他優化。 此外,從C ++流中讀取格式化的數據的速度較慢,因為它們可以與語言環境等配合使用。

但是,如果您經常要求進行隨機訪問,那么這將成為瓶頸,因為其他答案也是如此。 無論如何,最好的方法是使用探查器並評估您的應用程序性能。

暫無
暫無

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

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