我很想知道是否已經存在一種將java方法代碼作爲輸入並確定此類代碼(循環數,ifs/elses,I/O和其他常見事物)的代價函數的方法。 我的意思不是確切的成本在毫秒,但一些一般的代價可能會導致此代碼。 事情是,我想能夠爲用戶寫入的任意方法說什麼可以是這種方法的成本(當然不考慮像JVM等特殊性)。有沒有辦法確定任意java方法的一般成本函數?
回答
我不知道這樣的工具存在,但我懷疑它的可行性和實用性都:
對於在一般情況下,這種工具的可行性,看看在Halting problem,這是你要求的重要組成部分,並已被證明是undecidable。
對於這樣的工具的可用性,相信自身的靜態代碼分析是沒用的,因爲系統的性能的顯著部分取決於其輸入其使用模式,即。
有一個原因,即使在運行時的基準測試系統都不是直接的;在某些情況下,相同的軟件可能會非常快,而在其他軟件中則會驚人地慢。
這就是說,有several tools for code complexity analysis,但這些指標圍繞結構複雜性,這更多地涉及質量和可維護性比性能。
對於循環次數,如果/ elses可以使用圈複雜性度量。有工具可以計算它。例如,JavaNCSS。關於其他事情,你應該決定你對什麼感興趣。有很多software metrics,其中一些可能適合你。如果沒有,你可以發明你的並實施它們。說,PMD - 另一個收集不同指標的流行工具 - 允許您編寫自己的規則。
如果你想自動預測你的代碼的性能,那麼你是運氣不好。理由由thkala指出,其他原因包括JVM JIT編譯和運行時優化。這裏您最好的朋友是分析,(自動)性能測試和算法分析。靜態分析可以顯示一些潛在的性能問題,如連接字符串或在循環中分配對象。現代的IDE能夠做到這一點。儘管如此,性能主要取決於算法和體系結構,所以在靜態分析方面幾乎不會有太多改進。
謝謝你們!是的,我知道結構複雜性不會給我真正的成本,但我想從那裏開始,然後看看我還需要考慮什麼。我會研究這些鏈接,看看我能做些什麼。 – kepha 2012-08-16 22:22:44
- 1. 有沒有辦法一般地用Moq模擬DbSet.Find方法?
- 2. 有沒有辦法掛鉤Java方法?
- 3. 有沒有辦法通過引用將成員函數傳遞給方法? [JAVA]
- 4. 有沒有辦法使C中的任意一個仲裁函數超時?
- 5. 有沒有辦法確定JavaScript函數是否有副作用?
- 6. 有沒有辦法確定Xcode4中未使用的函數?
- 7. 有沒有辦法將任意文本傳遞給Vim?
- 8. 有沒有辦法確定java中有多大的對象?
- 9. 有沒有辦法替換C++中的方法中的函數
- 10. 有沒有辦法強制一些方法的類沒有指定參數?
- 11. 將任意方法應用於所有子目標的一般方法?
- 12. Android/Java:有沒有辦法存儲一個方法?
- 13. 有沒有辦法將一個方法綁定到ListBox的DataTemplate?
- 14. ,有沒有辦法在運行時確定類的成員?
- 15. 有沒有辦法確定任務是否被重新分配?
- 16. 有沒有辦法用函數「find」實現通配符方法?
- 17. 有沒有辦法在jQuery中永久定義一個函數?
- 18. 有沒有辦法在matlab中定義一個通用函數?
- 19. 有沒有辦法在python中自動定義一個函數?
- 20. 有沒有一種方法來確定在Java方法中使用的變量?
- 21. 有沒有辦法將控制器方法指向任意視圖?
- 22. 有沒有辦法確定未使用的數據綁定
- 23. 有沒有辦法鎖定PHPUnit版本?
- 24. 有沒有辦法運行ajaxSetup中定義的第一個基本函數?
- 25. 有沒有辦法指定一個Scala函數文本的返回類型?
- 26. 有沒有辦法確定一個類是Java中的一個實例?
- 27. 有沒有辦法確定共享庫的導出符號的函數參數?
- 28. 有沒有辦法確定Java System.in是否是「交互式」?
- 29. 有沒有辦法引用Kotlin頂級函數的Java類?
- 30. 有沒有辦法在java中的父類中調用函數?
這個問題涉及靜態分析中的一個深層問題,一般來說解決方案將如此近似,它們可能不適用於您關心的案例(請閱讀,靜態分析很難)。如果您對*爲什麼*要多一些背景知識,那麼您可以針對您可以使用的工具獲得更精確的答案。 – 2012-08-16 22:12:28
許多超酷的算法都需要相當複雜的技術來證明其漸近複雜性。僅從代碼中完成這一切都是不可能的。 – 2012-08-16 22:35:48