精華區beta C_and_CPP 關於我們 聯絡資訊
為了驗證 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)
renderer:感謝 cppOrz 的測試 61.222.148.171 08/24
※ 編輯: cppOrz 來自: 59.120.214.120 (08/24 10:10)