推 renderer:感謝 cppOrz 的測試 61.222.148.171 08/24
※ 編輯: cppOrz 來自: 59.120.214.120 (08/24 10:10)
為了驗證 operator+ 的實作效能,特別寫了幾段小程式測試
struct X
{
int val[1000];
X &operator+=(X const &rhs)
{
for (int i=0; i<1000; ++i) { val[i] += rhs.val[i]; }
return *this;
}
};
X const operator+(X const &lhs, X const &rhs) // 版本 X1
{
return X(lhs) += rhs;
}
X const operator+(X const &lhs, X const &rhs) // 版本 X2
{
X t;
for (int i=0; i<1000; ++i) { t.val[i] = lhs.val[i] + rhs.val[i]; }
return t;
}
void Test1() // 測試程式,做 20 萬次加法運算
{
for (int i=0; i<200000; ++i) { X a, b, c; c = a+b; }
}
平均執行效率如下:(以下時間單位為 Ticks)
版本 X1 版本 X2
VC6(D) 3390 2578
VC6(R) 1250 750
g++3.4.2(D) 1984 1891
BCC5.6.4(D) 1394 1594
BCC5.6.4(R) 672 690
其中(D) 是 Debug 版,(R)是 Release 版,但我想還是以 Debug 版為主,
因為 Release 版做的一些優化說不定把某些動作省略了。
所以主要比較的還是 X1 和 X2 之間的差距,VC 的結果是 X2 明顯優勢,
BCC是 X1 優勢,g++ 是差不多,X2 稍好。也就是說 VC6 的 RVO 技術可
能做得不是挺好才會這樣(因為即使 Release 版也是 X2 明顯優勢)
又,感覺 BCB 的 RVO 是最厲害的,對暫時物件的優化處理向來是 Borland
的專長。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.120.214.120
※ 編輯: cppOrz 來自: 59.120.214.120 (08/24 09:19)