2012-08-16 23 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

相关问题