2012-08-16 44 views
5

我很想知道是否已經存在一種將java方法代碼作爲輸入並確定此類代碼(循環數,ifs/elses,I/O和其他常見事物)的代價函數的方法。 我的意思不是確切的成本在毫秒,但一些一般的代價可能會導致此代碼。 事情是,我想能夠爲用戶寫入的任意方法說什麼可以是這種方法的成本(當然不考慮像JVM等特殊性)。有沒有辦法確定任意java方法的一般成本函數?

+1

這個問題涉及靜態分析中的一個深層問題,一般來說解決方案將如此近似,它們可能不適用於您關心的案例(請閱讀,靜態分析很難)。如果您對*爲什麼*要多一些背景知識,那麼您可以針對您可以使用的工具獲得更精確的答案。 – 2012-08-16 22:12:28

+0

許多超酷的算法都需要相當複雜的技術來證明其漸近複雜性。僅從代碼中完成這一切都是不可能的。 – 2012-08-16 22:35:48

回答

5

我不知道這樣的工具存在,但我懷疑它的可行性和實用性都:

  • 對於在一般情況下,這種工具的可行性,看看在Halting problem,這是你要求的重要組成部分,並已被證明是undecidable

  • 對於這樣的工具的可用性,相信自身的靜態代碼分析是沒用的,因爲系統的性能的顯著部分取決於其輸入其使用模式,即。

    有一個原因,即使在運行時的基準測試系統都不是直接的;在某些情況下,相同的軟件可能會非常快,而在其他軟件中則會驚人地慢。

這就是說,有several tools for code complexity analysis,但這些指標圍繞結構複雜性,這更多地涉及質量和可維護性比性能。

1

對於循環次數,如果/ elses可以使用圈複雜性度量。有工具可以計算它。例如,JavaNCSS。關於其他事情,你應該決定你對什麼感興趣。有很多software metrics,其中一些可能適合你。如果沒有,你可以發明你的並實施它們。說,PMD - 另一個收集不同指標的流行工具 - 允許您編寫自己的規則。

如果你想自動預測你的代碼的性能,那麼你是運氣不好。理由由thkala指出,其他原因包括JVM JIT編譯和運行時優化。這裏您最好的朋友是分析,(自動)性能測試和算法分析。靜態分析可以顯示一些潛在的性能問題,如連接字符串或在循環中分配對象。現代的IDE能夠做到這一點。儘管如此,性能主要取決於算法和體系結構,所以在靜態分析方面幾乎不會有太多改進。

+0

謝謝你們!是的,我知道結構複雜性不會給我真正的成本,但我想從那裏開始,然後看看我還需要考慮什麼。我會研究這些鏈接,看看我能做些什麼。 – kepha 2012-08-16 22:22:44

相關問題