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

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

C++ 性能剖析 (三):Heap Object對比 Stack (auto) Object

2019-11-15 01:46:27
字體:
供稿:網(wǎng)友
C++ 性能剖析 (三):Heap Object對比 Stack (auto) Object通常認(rèn)為,性能的改進是90 ~ 10 規(guī)則, 即10%的代碼要對90%的性能問題負(fù)責(zé)。做過大型軟件工程的程序員一般都知道這個概念。

然而對于軟件工程師來說,有些性能問題是不可原諒的,無論它們屬于10%或是90%,都是“必須”改進的。這里就講講其中的一個問題:用heap還是用stack的問題。

java, C#,和JavaScript的程序員一般都不用管自己創(chuàng)建的object是在heap里還是在stack里,因為對于這些語言,object 只能“生活在”heap里。這無疑對于程序員來說簡單了許多。但是對于C++程序員來說,你可以選擇三處來創(chuàng)建object:

  • 程序的data section
  • 工作堆棧
  • Heap

Object 因該生活在哪里?這個問題必須由應(yīng)用的屬性來決定,有時是沒有選擇的,比如對于動態(tài)產(chǎn)生的全程變量,只有活在heap里,別無它途。

然而,一旦我們有選擇,比如臨時的,作為復(fù)雜數(shù)據(jù)的載體的object,答案是清楚的:應(yīng)該首選stack. 比如下面簡單的例子:

// heap vs stack test

double HeapVsStack(bool heap, int loop, int &result)

{

if (heap)

{

clock_t begin = clock();

for(int i = 0; i < loop; ++i)

{

intPair *p = new intPair(1,2);

result += p->ip1 + p->ip2;

delete p;

}

clock_t end = clock();

return double(end - begin) / CLOCKS_PER_SEC;

}

else

{

clock_t begin = clock();

for(int i = 0; i < loop; ++i)

{

intPair p = intPair(1,2);

result += p.ip1 + p.ip2;

}

clock_t end = clock();

return double(end - begin) / CLOCKS_PER_SEC;

}

}

程序中黑體放大的部分是要測量的“應(yīng)用邏輯”,上方在heap中創(chuàng)建了一個intPair,用完后delete掉。下方在stack里定義一個同樣的auto變量,用完后無須care.

對這個程序作下列簡單測試調(diào)用:

int result = 0;

printf("Stack time: %f /n", HeapVsStack(false, 100000, result));

我不得不調(diào)用100000次,原因是它們的耗時差別實在太大了:stack 的用例不到10000次以上都顯示0ms.

測試結(jié)果,heap用了300ms, stack用了5ms, 相差60倍。

結(jié)論:

1) 如果應(yīng)用邏輯容許,用 stack-based auto 變量,千萬不用 heap 變量.

2) 如果需要大量用heap,建議用std::vector來當(dāng)作自己的 heap 簡單管理器用。避免直接地,大量地用heap來創(chuàng)建 ad-hoc object.

3) 有些臨時計算用的class可以考慮禁止在heap中生成,見http://stackoverflow.com/questions/1941517/explicitly-disallow-heap-allocation-in-c 文章。

2014-8-23 西雅圖


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 乌兰浩特市| 香格里拉县| 奈曼旗| 南宫市| 乌审旗| 正阳县| 伊宁县| 凭祥市| 牙克石市| 南宁市| 都兰县| 凌源市| 静安区| 东海县| 清水河县| 大港区| 马尔康县| 淮滨县| 巴彦县| 婺源县| 盘山县| 南宁市| 大理市| 新营市| 江陵县| 白河县| 宜兴市| 吉安县| 府谷县| 丁青县| 芮城县| 繁峙县| 邮箱| 宣化县| 体育| 雅安市| 灵璧县| 崇信县| 濮阳县| 石林| 恩平市|