国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

編譯器對標準庫優化小測試

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的指針。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 天水市| 麟游县| 孟津县| 满城县| 安义县| 瓦房店市| 巴彦淖尔市| 惠州市| 寿光市| 油尖旺区| 罗甸县| 北宁市| 富民县| 城口县| 枝江市| 沾益县| 茶陵县| 大同县| 综艺| 民勤县| 扬中市| 文水县| 霞浦县| 南岸区| 黄陵县| 泗水县| 庄浪县| 芒康县| 巴彦淖尔市| 沂水县| 兴山县| 承德县| 垣曲县| 克拉玛依市| 从化市| 运城市| 布拖县| 吴旗县| 昔阳县| 巍山| 团风县|