2010-11-11 25 views
1

我有一些模板化的C++代碼,我正在使用。我可以在調試模式下使用AMD工具進行編譯和配置。然而,如果沒有優化,大部分時間都集中在模板代碼和STL上。通過優化的編譯,我知道的所有配置文件工具都會生成垃圾信息。有沒有人知道一個好的方法來分析優化的本機代碼配置文件優化的C++/C代碼

PS1: 我寫的代碼也是模板化的。大部分時間花在未經優化的代碼上都會被優化掉。我說的是,96-97%的運行時間都是在模板化代碼中進行的,沒有進行優化。這將破壞分析的準確性。是的,我可以更改許多模板代碼,或者至少模板代碼的哪一部分引入了最大的麻煩,我可以在這些地方做得更好。

+1

如果您在Linux上執行此操作,請使用gprof。 – 2010-11-11 23:50:47

回答

3

您應該專注於您編寫的代碼,因爲這是您可以更改的內容,在STL中花費的時間無關緊要,只需忽略它並專注於該代碼的調用者即可。如果在STL中花費了太多時間,則可能會調用其他一些STL基元而不是當前的基元。

分析未優化的代碼不太有趣,但仍可以獲取一些信息。如果從代碼的某些部分使用的算法完全有缺陷,它甚至會出現在那裏。但是,您應該能夠從優化代碼中的任何良好的性能分析工具中獲得有用的信息。你準確地使用了哪些工具?爲什麼要調用他們的輸出垃圾?

另外它通常很容易手工測試代碼,並找出哪些部分是有效的,哪些不是。這只是在精心挑選的點上調用定時器功能(或者在可能的情況下讀取處理器的週期數)的問題。我通常通過單元測試來做到這一點,以獲得可重現的結果,但這些都取決於程序的具體情況。

工具或儀表代碼是優化的簡單部分。困難的部分是找到方法在需要的地方獲得更快的代碼。

+0

++,尤其是第一段。 – 2010-11-12 02:00:31

+1

@Mike Dunlavey:謝謝你的評論。這是特別令人愉快的來自你,作爲你的答案**性能優化策略的最後手段?**(http://stackoverflow.com/questions/926266/performance-optimization-strategies-of-last-resort/927773# 927773)是我在SO上的首選答案之一。 – kriss 2010-11-12 02:52:32

+0

我的意思是。當我看到這些通話圖表顯示圖書館中的網絡層時,我對此毫無辦法。我猜這可能是教育性的。 – 2010-11-12 13:11:24

2

你是什麼意思的「垃圾信息」?

分析只對優化的版本有意義,所以工具的設計與它們一起工作 - 因此,如果你得到毫無意義的結果,這可能是由於分析器找不到正確的符號或需要測試構建。例如,在發現英特爾VTune的情況下,我發現我從採樣器中得到了不可能的結果,除非我明確告訴它在哪裏可以找到我正在調試的可執行文件的PDB。在儀表版本中,我不得不擺弄這些設置,直到它可靠地將探測器放入函數調用中。

1

當@kriss說

你應該專注於你寫 的代碼,因爲那是你可以改變

這正是我要說。

我想補充一點,在我看來,首先對沒有優化編譯的代碼進行性能調優,然後再打開優化器,出於同樣的原因更容易。如果你能解決的問題是花費時間過多,那麼無論編譯器做什麼,它都會花費過多的時間,並且更容易在沒有被加擾的代碼中找到它。

我不通過測量時間尋找這樣的代碼。如果多餘時間是20%,那麼我所做的就是隨機暫停幾次。只要我看到可以在2個或更多樣本上明顯改進的東西,那麼我就找到了它。 It's an oddball method, but it doesn't really miss anything.我測量前後的整體時間,看看我節省了多少。這可以進行多次,直到找不到任何要修復的東西。 (順便說一下,如果你在Linux上,Zoom是一個更自動的方式來做到這一點。)

然後,你可以打開優化器,看看它給你多少,但是當你看到你做了什麼改變,你可以看到編譯器真的沒有辦法爲你做。