2012-11-13 39 views
4

我用C++編寫代碼。 讓s是一些字符串。我被要求確定以下哪個更快:輸出速度

cout << "s:" + s + "s:" + s + " s:" + s + "\n"; 

cout << "s:" << s << "s:" << s << " s:" << s << "\n"; 

我反覆運行他們兩個,發現第二個更快。我花了一段時間試圖找出原因。我認爲這是因爲在第一個中,字符串首先連接然後輸出到屏幕。但第二個直接輸出到屏幕上。那是對的嗎?

+1

的「功課」標籤被棄用:http://meta.stackexchange.com/questions/ 147100/-Homework-tag-is-now-official-deprecated – jogojapan

回答

4

第一個可能會涉及一些字符串連接的內存分配,然後將最終的連接字符串複製到輸出緩衝區。第二個將簡單地將已分配的字符串數據複製到已分配的輸出緩衝區。

0

從理論角度來看,第二個例子是線性時間,而第一個例子是可以是平方時間(在子串數中),具體取決於實現。

要確定您的實現是否屬於這種情況,您必須查看源代碼和(因爲編譯器可能會優化)機器代碼。

總之,原因取決於實現,而在一般情況下,確定「這是最快的」,你沒有選擇,只能測度。 「爲什麼」可以作爲啓發式指導。但這就是全部:最後,測量,現實,這一點很重要。

+0

這不僅僅是可以測量的,它可以在代碼中證明,stdout不會碰到緩衝創建時將會串聯字符串的限制。 – Michael

+0

@Michael:目前還不清楚您的意思是「可證明的」,但幾乎沒有任何東西可以從源代碼中得到證實。 OP的問題。特別是,一些C++編譯器有一定的選項,優化字符串連接,並且在某些庫實現中,每次調用'<<'都會導致性能下降。所以一般來說你只需要測量。 –

0

您的假設,第二個更快由於第一個創建字符串對象可能是正確的。這裏的關鍵是「可能」。這些是標準庫函數,因此可以有不同的實現細節,因爲標準定義了行爲,而不是如何實現。從理論上講,你可以找到一個標準的庫實現,其中你的發現是相反的。

+0

難道你不認爲在每個+上創建一個緩衝區的低效率在std lib中是真實的嗎? – Michael

+0

是的,但你認爲有可能編寫一個非常低效的流操作符?重點是它不能保證。它依賴於實現,所以你不能說#1總是比#2更快。 –