編譯器對標準庫優化小測試
2019-11-17 05:13:04
供稿:網友
《C++沉思錄》上面有一句話說,盡量使用標準庫(其實是指STL),因為編譯器可以對標準庫的代碼進行優化。我們可以做個測試來證實這句話,如下的代碼:
#include
#include
#include
#include
using namespace std;
#define TESTNUM 1000000
#define STRINGLENGTH 1000
string CreateString()
{
string s;
for (int i = 0; i < STRINGLENGTH; ++i)
{
s += char(rand()%255+1);
}
return s;
}
template inline
void MySwap(_Ty& _Left, _Ty& _Right)
{ // exchange values stored at _Left and _Right
_Ty _Tmp = _Left;
_Left = _Right, _Right = _Tmp;
}
int main()
{
vector box;
vector box2;
for (int i = 0; i < 100; ++i)
{
box.push_back(CreateString());
box2.push_back(NULL);
}
{
clock_t t1 = clock();
for (int i = 0; i < TESTNUM; ++i)
{
MySwap(box[rand()%100], box[rand()%100]);
}
cout << clock() - t1 << endl;
}
{
clock_t t1 = clock();
for (int i = 0; i < TESTNUM; ++i)
{
MySwap(box2[rand()%100], box2[rand()%100]);
}
cout << clock() - t1 << endl;
}
{
clock_t t1 = clock();
for (int i = 0; i < TESTNUM; ++i)
{
swap(box[rand()%100], box[rand()%100]);
}
cout << clock() - t1 << endl;
}
return 0;
}
MySwap實際上就是從STL里面原樣拷貝出來的,但是我們可以看到這和STL的Swap效率有天壤之別。因為string實際上一些必要的信息加上字符串緩存構成的,對于STL的Swap,編譯器知道只需要交換那些必要信息就可以了,而不需要進行深拷貝;但是對于我們寫的MySwap,編譯器不知道,所以進行了深拷貝。Swap比交換指針慢一點是因為string的必要信息比一個指針多一些。假如增加測試字符串的長度,會發現Swap的耗時是不變的,而MySwap的耗時會線形增加。
所以我們大可不必因為恐慌string的深拷貝,而在vector里面使用string的指針。