string result = str_you + 「said: 」 + str_he + 「 said: @#$% 」 + str_i + 「said: over!」;
對於這樣乙個語句,程式如何求值呢?假設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+,因此,先把表示式變形:
acce() + str_you + 「said: 」 + str_he + 「 said: @#$% 」 + str_i + 「said: over!」;
因為operator+從左向右結合,可以採用我們加速過的運算過程。先看最簡單的情況,和string相加。
template
struct accelerate;
template
inline accelerate< accelerate< left >, right>
operator+(accelerate< left >& lsh, const right& rsh)
顯然,accelerate是輕量級的,現在考慮怎麼實現operator string () const呢?我的計畫是,首先計算出字串的總長度,然後開乙個足夠大的空間來複製字串,避免反覆分配記憶體:
operator string () const;
第一步,看看怎麼實現length:
struct empty{};
template
inline size_t length(const t& t)
template
inline size_t length(const accelerate& t)
template<>
inline size_t length(const accelerate& t)
}template< >
copy(rsh.begin(), rsh.end(), back_inserter(str));
}現在,我們整個計算的框架算是完成了,不過可真夠複雜的。注意觀察,實際上,accelerate利用多重繼承,把表示式轉換成乙個二叉樹,葉結點就是實際的字串。對於acce有如下定義:
typedef accelerateacce;
size_t length(const char* str)
template
size_t length(const char[size] str)
while(*src != 『』) str.push_back(*src++);
}效能分析:
string str;
str.reserve(length(left) + length(right));
轉
C 之奇技淫巧
typedef struct data 0 pdata 0 typedef struct data 1 pdata 1 結構體data 0與data 1在性質上沒有什麼不同,它們的size是相等的,都是8.但在用法上有很大區別。例 pdata 0 stack0 pdata 0 malloc max ...
c 的奇技淫巧
關於陣列 數論演算法技巧 stl其他 while scanf d d n,m eof 等價於 while scanf d d n,m 2 前者eof為檔案結束符,較保險 後者 後的數字為輸入的變數的個數 不能只寫while scanf d d n,m 這樣無法結束讀入 wwq大佬教的,希望我不要和他...
C語言的一些奇技淫巧(1)巢狀語句
2.list for each safe 原始碼例子 參考此句中,i 3 是乙個語句,後面 是乙個復合語句 這句無論j 1 怎麼變,都是最後一句 true 為真。所以真正的還是前面i 3 成立即可 list for each safe iterate over a list safe against...