for (int i=0;i<5000;i++)
{
pstr[i] = new string;
}
此循環在堆中分配5000個串對象。
用大括弧將上面的代碼塊括起來并在代碼塊開始聲明類對象實例:
{
stopwatch watch; // 開始計時
string *pstr[5000];
for (int i=0;i<5000;i++)
{
pstr[i] = new string;
}
} // 摧毀計時器并報告結果
根據上面的代碼段,當代碼開始執行時,計時也開始,當代碼退出時,析構函數便顯示結果:
此操作所用時間: 27
轉換成秒數: 0.027
循環在運行這段代碼的機器上耗時27毫秒,F在對上面的代碼段稍做改動,使用棧動態分配內存會得到什么樣的性能數據呢?
{
stopwatch watch;
for (int i=0;i<5000;i++)
{
string s;//創建并銷毀本地的自動創建的串
}
}
這段代碼運行結果為:
此操作所用時間: 14
轉換成秒數: 0.014
可以看出,用棧代替堆分配內存速度提高了50%。而且使用堆內存的代碼還不包括銷毀5000個串所用的時間。使用棧內存的代碼不存在這個問題。由此很容易看出性能差別。
另外,使用堆內存的代碼還有5000個賦值操作:
pstr[i] = new string;
將代碼改動一下:
{
stopwatch watch;
for (int i=0;i<5000;i++)
{
new string; // 不用賦值的堆內存分配
}
}
通常的代碼是不能這樣寫的-原因是這樣的代碼造成嚴重的內存溢出。但它把分配操作與其它的變量隔離開了。這段代碼不是以賦值方式進行堆內存分配,這是性能調整時常用的方法,其運行結果如下:
此操作所用時間: 27
轉換成秒數: 0.027
也就是說賦值不影響性能。
性能測試常常需要一些技術實踐。開發人員的直覺常會令人誤入歧途-直觀上開銷很大的操作往往對性能影響不大,而一些表面上無所謂的操作象動態內存分配證明了在內存開銷上對CPU的依賴。所以說如果沒有可靠的性能測試作為手段,我們是很難發現性能事實的。
文章來源于領測軟件測試網 http://www.kjueaiud.com/