java,time if if语句和循环,而不是使用profiler的方法

时间:2015-08-03 01:38:45

标签: java performance timer profiling

我使用像VisualVM这样的工具来分析我的方法,找到减速方法以使它们更快,但我似乎无法找到任何能够为方法中的单个循环或代码块计时的分析器。

现在我必须采用手动计时>

long sTime = System.currentTimeMillis();
//my Code here
System.out.println("time=" + ((System.currentTimeMillis() - sTime)));

但这真的很乏味,因为我必须为每个循环/ if / codeblock手动添加和删除定时器以获得细粒度的定时数据。我想知道是否有任何工具可以分析代码块或某种eclipse插件,可以自动添加删除计时器的过程。我使用过代码模板,但远非完美。

我确定我不是唯一一个想要更优雅的细粒度分析解决方案的人。

2 个答案:

答案 0 :(得分:0)

要编写微基准测试,您应该使用合适的线束,例如JMH。使用正确的基准测试工具还可以避免the common pitfalls

答案 1 :(得分:0)

你说(实际上)你想知道如何让你的代码运行得更快。 这就是大多数人想要做的事情。 有一种简单的方法,根本不需要探查器。

你的代码只能在相同的硬件上运行得更快,如果它正在做一些它不需要做的事情而你就摆脱了那个东西。别无他法。
删除它(让我们称之为K)将节省一些时间。我们假设它是30%。

这意味着如果你有办法获得一个随机时间的堆栈样本,比如 jstack ,或者只是在调试器中暂停并显示堆栈(可能还有一些数据),那个样本至少至少在K期间发生30%的机会。“至少”因为它可能实际花费50%的时间,而修复只能节省30%。
如果你这样做10次,你可以看到K大约3次(或更多)。

所以这样做10次 每个堆栈示例将向您显示堆栈中的每个函数和代码行,如果您阅读它,您将完全了解它正在做什么,以及为什么,在那个时刻。
在堆栈的任何级别查找任何可以做得更好的事情 如果你看到一件可以做得更好的特定事情,并且你在多个样本上看到它,你就找到了K.
事实上,它的百分比越大,你需要的样本就越少 修复它,然后使用计时器查看结果。

然后你可以重新做一遍,以获得下一次加速。
如果找不到,您的代码基本上是最优的。

这可能会令人惊讶,但是这可以找到任何探查者可以找到的任何加速,以及一些他们不会找到的加速度。
它被称为random pausing,很多人都依赖它。

有些人说这只是个人,只有更好,但他们需要考虑一下。 甚至优秀的剖析器采用线路级精度对壁挂时间进行采样的问题是它们有一个后端总结 - 热路径,调用图,火焰图,“总时间”,“自我时间” ... 随你。 我们鼓励您查看它,而不是实际样本本身 This post显示加速对这些摘要的隐藏是多么容易,以及为什么这是一件坏事。
样本是洞察力的地方,告诉您可以做得更好的事情,如果需要足够的时间来进行修复,则不需要大量的样本来查看它。
如果你想知道为什么,the math is here.

回应评论:

你走在正确的轨道上。你知道它适用于无限循环或接近无限循环,因为这样的问题需要99.99%的时间,所以你的停顿肯定会落在其中。如果问题占用的时间比例较小,例如30%甚至10%,它也可以使用。

问题需要时间F,然后你会平均看到每个1 / F样本。 例如,如果F为0.3(30%),那么您将平均每1 / 0.3 = 3.33个样本看到它。 但是,如果您只看到一些可疑代码一次,这并不意味着它是一个问题。 但如果你看到两次(或更多),那么你肯定知道它是一个获得加速的机会。 两次查看问题所需的平均样本数为2 / F,或者如果F为30%,则为6.67个样本。 因此,请继续采样,直到您看到两次可疑代码为止。

如果你的代码运行得太快,没问题。只需在它周围放一个长时间运行的循环。假设它需要3微秒,如你所说。你所要做的就是循环10 ^ 7次,这需要30秒。 如果在30%的时间里有一个加速机会,每次暂停都有30%的机会显示它,无论它有多快。 您无需担心代码速度快。

您希望节省约70%的时间。它可能需要多次修复才能执行此操作。假设有可能加速30%,20%,10%和10%。删除30%的一个,并将其他人扩大1.43到29%,14%和14%。删除29%的一个,现在它们分别是20%和20%。删除下一个,最后一个是25%。这就是你获得大幅加速的方法 - 剥离。

现在这里是最重要的一点: 你可以从中看到,不要错过任何一个是多么重要。 得到四分之三,缺少一个,将切掉芥末。 Speedup opportunities can easily hide from profilers' summaries,但他们无法隐藏你看堆栈样本。 忘记所有花哨的探查器结果,你需要速度,这就是底线。