Re: [問題] 相同程式 (/clr:pure) (/clr)速度差異

看板C_and_CPP作者 (TDYa127)時間14年前 (2011/02/10 07:36), 編輯推噓0(007)
留言7則, 2人參與, 最新討論串7/9 (看更多)
※ 引述《HeyScng ( )》之銘言: : 前文恕刪 : : -- : : ◆ From: 140.96.63.154 : : → kazuto:template應該是編譯期行為吧? 02/09 11:46 : : → horngsh:推1F 02/09 13:55 : : 推 Ebergies:如果你用的是 C# Generics 的話, 那麼它是在執行期才產生 02/09 16:08 : : → Ebergies:但只會產生一次, 如果你使用次數夠多應該是不成問題才對 02/09 16:09 : 的確我也認為template instantiation在編譯期 : 但實際在 /clr 選項編譯下(win32 console) 速度卻有明顯差異 : 測試程式碼如連結 http://nopaste.csie.org/a6909 : 執行結果: : TestFunction1 elapsed: 2312 : TestFunction1 elapsed: 422 : 因此才懷疑 template 誤用或希望可藉compiler設定加快速度 : 因為會使用 Windows form 與 許多dll 因此必須使用 /clr : 不過主要目的只是想要重覆程式碼少一點 : 所以如果有其他寫法可以達成 也請指教 : 謝謝 == 看程式碼和執行時間,或許跟inline有關。 猜測前面的變成傳function pointer,要多一次function call, 而後面的直接被inline掉了。 == 上面的猜測是錯的。 事實上根本沒inline, 有差的或許是是Calli和Call的差別? 前者: ldarg.s 6 ; func$ calli D:I(II) 後者: call ??$ReturnMax@G@@$$FYAABGABG0@Z 不過/clr:pure在那段ASM上看不出差別, 可能主要的差距是因為.NET VM做的事? 不過結論還是一樣, 能用functor就盡量用functor吧,: 環境: Microsoft Visual C++ 2008 Intel E3200@3.2GHz 修改前: TestFunction1 elapsed: 84334 TestFunction1 elapsed: 842 用functor的程式碼: http://nopaste.csie.org/97383 修改後: TestFunction1 elapsed: 499 TestFunction1 elapsed: 905 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 219.71.32.69

02/10 15:53, , 1F
看了ASM後,我錯了,不是inline的問題,根本沒inline到。
02/10 15:53, 1F

02/10 15:53, , 2F
修改一下文章@_@a
02/10 15:53, 2F
※ 編輯: a127a127 來自: 219.71.32.69 (02/10 16:08)

02/10 16:12, , 3F
補充:用functor比較快的原因才是因為inline掉了。
02/10 16:12, 3F

02/10 19:16, , 4F
受教了,不過我不太能了解他只是多jmp一次到??$ReturnMax@G
02/10 19:16, 4F

02/10 19:16, , 5F
為什麼會多花這麼多時間?
02/10 19:16, 5F

02/10 19:52, , 6F
我也不知道,不過我猜是透過function pointer間接呼叫時
02/10 19:52, 6F

02/10 19:56, , 7F
.NET VM得多做一些判斷和檢查,可能跟CLR支援有關係。
02/10 19:56, 7F
文章代碼(AID): #1DKvMRZQ (C_and_CPP)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 7 之 9 篇):
文章代碼(AID): #1DKvMRZQ (C_and_CPP)