正如其他人已經指出的那樣(例如參見herohuyongtao's answer),環路條件以及如何將str1
放入istringstream
必須固定。
但是,這裏有一個重要的問題,大家都錯過了目前爲止:你根本不需要istringstream
!
vec.reserve(the_number_of_words_you_exptect_at_least);
while (infile >> str1) {
vec.push_back(str1);
}
它擺脫了內循環,你並不需要擺在首位,並且不產生在每個迭代的istringstream
的。
如果您需要進一步分析每一行,你確實需要一個istringstream
,創建外循環,並通過istringstream::str(const string& s)
設置其字符串緩衝區。
我可以很容易地想象你的循環速度非常慢:Windows上的堆分配非常慢(與Linux相比);我被咬了一次。
Andrei Alexandrescu在他的演講Writing Quick Code in C++, Quickly中介紹了(某種意義上)的一個類似的例子。令人驚訝的是,在像上面那樣的緊密循環中執行不必要的堆分配可能比實際的文件IO慢。我很驚訝地看到這一點。
您沒有將您的問題標記爲C++ 11,但這裏是我在C++ 11中所要做的。
while (infile >> str1) {
vec.emplace_back(std::move(str1));
}
此舉構建在載體的背面,沒有複製的字符串。我們可以做到這一點,因爲我們不需要的str1
的內容,我們已經把它變成矢量之後。換句話說,不需要將其複製到向量背後的全新字符串中,只需將其內容移動到該向量就足夠了。第一個循環與vec.push_back(str1);
可能可能複製str1
這是真的不必要的內容。
gcc 4.7.2中的字符串實現當前爲copy on write,所以兩個循環具有相同的性能;你使用哪一個並不重要。目前。
不幸的是,現在寫入字符串的拷貝現在被標準禁止了。我不知道gcc開發人員何時會改變實現。如果實施更改,無論您移動(emplace_back(std::move(s))
)還是複製(push_back(s)
),都可能會影響性能。
如果C++ 98兼容性對您很重要,那麼請使用push_back()
。即使未來發生最糟糕的事情,並且您的字符串被複制(它現在不被複制),該副本可以變成快速發展的memmove()
/memcpy()
,這可能比從文件中讀取文件的內容更快硬盤所以文件IO很可能仍然是瓶頸。
來源
2014-01-25 10:52:26
Ali
第一件事,第一:[爲什麼的iostream ::內EOF循環條件考慮錯誤?](http://stackoverflow.com/q/5605125/1870232) – P0W
什麼格式?似乎你正在試圖解析文件,在這裏我沒有看到太多的優化空間。其實**測量**,這是一個瓶頸? – 2014-01-25 10:14:22