2012-08-08 51 views
2

我想知道是否有可用的技術或工具可以告訴您需要多少時間來執行特定的方法。找到成本最高的方法並評估/剖析它們

一些類似於數學/計算機科學中的大O符號,可以給你一個算法的複雜性的想法,我不知道代碼分析是否有類似的東西。

+0

你會如何回答自己這個問題計劃? – 2012-08-08 23:59:02

+0

@KirillKobelev我想在可能的時候學習新東西。 – user827992 2012-08-09 00:00:45

回答

1

你應該嘗試使用callgrind啓動運行你的代碼,它會記錄被調用的函數的次數,但代碼將運行速度慢20倍或等等。在獲得callgrind輸出後,您應該使用kcachegrind打開它以查看調用的樹結構。在那裏,你可以瀏覽一下,看看你有沒有瓶頸

相關鏈接:
kcachegrind http://kcachegrind.sourceforge.net/html/Home.html
callgrind文檔http://valgrind.org/docs/manual/cl-manual.html
(Valgrind是框架,callgrind是一個組件)
如何在程序啓動callgrind產生過程並且你也想要描述這些過程(替換鼠尾草凳。與您的程序PY)https://github.com/titusnicolae/pynac-callgrind/blob/master/run.sh
編輯:「--instr-atstart =沒有」應該被從參數列表中刪除,如果你不扶持的儀器後

2

如果你想知道在一個函數中花了多少時間,使用一個所謂的「探查器」。但是,因爲一個分析器告訴你當你運行一個程序時會發生什麼,而複雜性告訴你當你運行一個無限序列的程序時會發生什麼情況的限制行爲和更大的投入。所以:你想知道哪些函數在你的程序中花費最大(在這種情況下,爲你的C++實現找到一個分析器並且遵循它的文檔),或者你想知道時間複雜度(在這種情況下,你幾乎需要一個人來分析你的代碼)?

0

這與停止問題有什麼不同?

請注意,我可以使用自動複雜度分析器來解決暫停問題 - 你的問題是HARDER。而停止問題已經是不可判定的。

4

Profiling是分析程序以確定在特定函數或方法中花費的時間的相對量的手段。這對於憑經驗發現程序中的性能問題很有用。使用GCC,例如,您可以:

  • -pg選項來啓用分析編譯程序。

  • 運行可執行文件以生成一個名爲gmon.out的文件,該文件包含程序實際運行時的運行時特徵信息。

  • 運行gprof以顯示由插裝的可執行文件生成的信息。

一般來說,人的分析是發現漸近(即,大O)的複雜性的唯一途徑特定算法,有,所以據我所知,沒有機械的方式來做到這一點。