對于這樣一個語句,程序如何求值呢?假設str_you是一個典型std::string類型,這個語句需要做5 次operator+運算,多個string臨時對象,還極有可能的,多次的內存分配操作。
如果你的team leader對你說了類似話,兄弟,他是對你的代碼性能不滿呢。當然,聰明如你,一定會在上司找到你之前就發現了這里是個性能瓶頸,并且告訴他你正著手解決它呢。
辦法是多種多樣的,最正確的辦法當然首先是看看設計上是否存在缺陷,并且可以修復以改善性能問題。假設,任何部分都很正確(我知道這不可能,一定有被你稱為菜鳥的同事干了蠢事,不是嗎?),責任只好落到你的肩上。打算怎么辦?
我不知道你會怎么做,也許你會換一個更快的string,或者簡單調整一下語句:
string result;
result.reserve(1000);
result += str_you; result += “said: ”;
result += str_he; result += “ said: @#$% ”;
result += str_i; result += “said: over!”;
如果只有一兩個性能熱點,我打賭,我會這樣先嘗試一下。我認為這是一個很好的開始,我們已經認識到導致瓶頸的原因并且試圖消除它。你也可以這么做。 寫這篇文章,當然意味著還有別的方法,而且和懶惰計算有關。因為我們不能修改basic_string::的operator+,因此,先把表達式變形:
Aclearcase/" target="_blank" >cce() + str_you + “said: ” + str_he + “ said: @#$% ” + str_i + “said: over!”;
因為operator+從左向右結合,可以采用我們加速過的運算過程。先看最簡單的情況,和string相加。
template<typename Left, typename Right>
struct Accelerate{
operator string () const;
Left& left;
Right& right;
};
template<typename Left, typename Right>
inline Accelerate< Accelerate< Left >, Right>
operator+(Accelerate< Left >& lsh, const Right& rsh)
{
return Accelerate< Accelerate< Left >, Right>(lsh, rsh);
}
顯然,Accelerate是輕量級的,現在考慮怎么實現operator string () const呢?我的計劃是,首先計算出字符串的總長度,然后開一個足夠大的空間來復制字符串,避免反復分配內存:
原文轉自:http://www.anti-gravitydesign.com