程式如下
DWORD begintick;
DWORD len;
begintick=::GetTickCount();
char *p;
for(i=0;i<40000000;i++)
{int ik;
p=new char [2000];
for(ik=0;ik<2000;ik++)
p[ik]=ik;
delete p;
}
len=::GetTickCount()-begintick;
printf(" the len=%d",len);
使用64位程式 RELEASE(沒試32位的) 在同一臺機上運行,結果兩個之間的速度差別在10%以上,以前沒有想到會有這樣的差別,還是其它什么什么問題,關于編譯設定我大概檢查了一下,沒有問題。
uj5u.com熱心網友回復:
反匯編了一下 發現一個用INC 一個用 ADD 1 指令不知是不是這個原因, 以后測驗了一下, 將p[ik]=ik;改成p[ik]=8;后速度又基本上一致了。uj5u.com熱心網友回復:
delete []p;這樣才更好。
uj5u.com熱心網友回復:
delete []p; delete p;效果是一樣的,p 指的不是物件。我注意的問題的兩個編譯器的優化效果問題。
uj5u.com熱心網友回復:
涉及new的,就跟系統的庫有關了,如果比較優化效果,看匯編代碼就行。uj5u.com熱心網友回復:
查出來了,可能是NEW DELETE 的效率問題。VS2005的 NEW 執行要慢。uj5u.com熱心網友回復:
Win7其實為回教異化的XP。VC8為荷蘭版,雖然前一陣荷蘭比較混亂,但荷蘭還是盟軍的一員。了解了這個,為什么Win7上VC8編譯的程式速度慢原因就簡單了。
uj5u.com熱心網友回復:
無profiler不要談效率!!尤其在這個云計算、虛擬機、模擬器、CUDA、多核 、多級cache、指令流水線、多種存盤介質、……滿天飛的時代!
uj5u.com熱心網友回復:
我檢查了一下發現兩者的編譯器還是有一定性能上差別的,去NEW DELETE 操作程式如下:
DWORD i;
DWORD begintick;
DWORD len;
char *p; p = new char[2000];begintick = ::GetTickCount();
for (i = 0; i<40000000; i++)
{
int ik;
for (ik = 0; ik<2000; ik++)
{
p[ik] = ik;
}
}
len = ::GetTickCount() - begintick;
delete p;
printf(" the len=%d", len);
VS2015 編譯如下
for (ik = 0; ik<2000; ik++)
000000013FE11040 xor ecx,ecx
000000013FE11042 mov rdx,rbx
000000013FE11045 nop word ptr [rax+rax]
{
p[ik] = ik;
000000013FE11050 mov byte ptr [rdx],cl
000000013FE11052 lea rdx,[rdx+1]
000000013FE11056 inc ecx
000000013FE11058 cmp ecx,7D0h
000000013FE1105E jl main+50h (013FE11050h)
for (i = 0; i<40000000; i++)
000000013FE11060 sub r8,1
000000013FE11064 jne main+40h (013FE11040h)
}
VS2005 編譯如下
for (ik = 0; ik<2000; ik++)
0000000000401030 xor ecx,ecx
0000000000401032 mov rdx,rbx
0000000000401035 xchg ax,ax
0000000000401039 xchg ax,ax
000000000040103C xchg ax,ax
{
p[ik] = ik;
0000000000401040 mov byte ptr [rdx],cl
0000000000401042 add ecx,1
0000000000401045 add rdx,1
0000000000401049 cmp ecx,7D0h
000000000040104F jl wmain+40h (401040h)
for (i = 0; i<40000000; i++)
0000000000401051 sub r8,1
0000000000401055 jne wmain+30h (401030h)
}
兩者執行速度差別在10%。
更為想不到的是如果改p[ik] = ik;為p[ik] =8時
VS2015 執行顯示為0,反匯編了一下,沒有相應代碼,也就是此時編譯器已經知道了此代碼為無效代碼。
但VS2005沒有此優化的結果。
uj5u.com熱心網友回復:
所以,還是盡量用最新的編譯器吧轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/130544.html
標籤:基礎類
