然而對于軟件工程師來說,有些性能問題是不可原諒的,無論它們屬于10%或是90%,都是“必須”改進的。這里就講講其中的一個問題:用heap還是用stack的問題。
java, C#,和JavaScript的程序員一般都不用管自己創(chuàng)建的object是在heap里還是在stack里,因為對于這些語言,object 只能“生活在”heap里。這無疑對于程序員來說簡單了許多。但是對于C++程序員來說,你可以選擇三處來創(chuàng)建object:
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;
新聞熱點
疑難解答