2012-01-21 34 views
3

我參與了一些編程競賽,並且在很多問題中需要從輸入文件中讀取字符串。顯然,在這些比賽中表現是一個大問題,字符串可能很大,所以我想了解最有效的方式來閱讀這些字符串。有沒有比getchar()(C/C++)更快地讀取字符串的方法?

我的猜測是用char(char)讀取字符串char是最快的。這是因爲即使使用其他函數,比如fgets()或getline(),那些函數仍然需要讀取每個字符。

更新:我知道I/O不會成爲大多數算法問題的瓶頸。這就是說,我仍然非常想知道什麼是你可以用來讀取字符串的最快方式,如果這會成爲未來任何問題的一個問題。

+0

如何使用良好的舊C++流? –

+3

編程競賽問題的設計方式,I/O不會是振振有詞的瓶頸。如果你超時,那是因爲你的實際工作算法不夠聰明。 –

+1

@Kari Knechtel,我同意這一點。這就是說,因爲無論如何我需要閱讀輸入內容,所以我寧願以最有效的方式來做,而不用擔心以後能否改進。 –

回答

5

您可以使用std::istream::read()函數讀取一塊未格式化的數據。正因爲數據爲未格式化,所以速度相對較快。所有過載operator>>讀取格式化數據,這使得從數據流讀取比read()慢。

同樣,您可以使用std::ostream::write()函數一次寫入一個數據塊來輸出流。

+1

我認爲這就是我所需要的。謝謝! –

1

恰恰相反,在一次讀取大塊數據到內存中比一次讀取一個字符要快得多。在任何情況下,操作系統和/或硬盤驅動都會緩存數據,但是對於大型數據集來說,重複循環通過標準庫,操作系統,文件系統和每個字符的設備驅動程序的函數調用開銷是很重要的。

當處理字符串有一些比較重要的性能問題,你可能會考慮:Back to Basics by Joel Spolsky

無論哪種方式,最有說服力的方式來回答這個問題對自己是編寫調查不同的我之間的差異測試代碼/ O方法。

+0

另外,在某些平臺上,每個stdio調用都會產生一個鎖,這進一步增加了逐字節IO的成本。 –

相關問題