java - 测量 Java 方法重构性能

标签 java performance memory

我接到了一项奇怪的任务。我必须在庞大的代码库(简单的部分)中重构某些方法并提供性能增益报告。我应该关注执行速度和内存使用情况。他们想知道方法的性能改进!

所以我有一个这样的方法:

public void processHugeFile(File f) {
   long start = java.lang.System.currentTimeMillis();

   // lots of hashmaps, lots of arrays, weird logic,...

   long end = java.lang.System.currentTimeMillis();
   logger.log("performance comparison - exec time: " + (end - start));
}

然后我必须重构它:

public void processHugeFile(File f) {
   long start = java.lang.System.currentTimeMillis();

   // just lists, some primitives, simple logic,...

   long end = java.lang.System.currentTimeMillis();
   logger.log("performance comparison - exec time: " + (end - start));
}

最后我只需要处理日志即可。

但是内存使用又如何呢?我尝试过 getRuntime().totalMemory() - getRuntime().freeMemory() 和 getHeapMemoryUsage().getUsed() 但它们似乎不起作用。另外,JVM 分析器关注的是对象而不是方法,我指的是相当大的代码库。

有人可以给我一些提示吗?

非常感谢。

最佳答案

从广义上讲,重构不是提高性能的手段,而是提高代码库的可读性和可维护性的手段。 (这可能会帮助您更加自信和轻松地进行优化和架构更改。)我假设您已经意识到这一点,并且您的意思是您正在尝试清理过程中的一些缓慢代码。

这实际上是一个分析器工具,而不是手动工具。通过这种方式您永远无法获得精确的测量结果。例如,System.currentTimeMillis() 调用会增加其自身的开销,并且对于短期方法来说,其花费的时间可能比方法本身更长。 运行时只能帮助您粗略了解内存使用情况。

我不同意分析器没有帮助。例如,JProfiler 会很高兴地绘制随时间变化的堆大小图,包括生成大小。它将按分配站点、对象类型分割内存使用情况。它将通过包含/独占时间向您显示性能瓶颈。而所有这一切都无需触及您的代码。

您真的非常想使用像 JProfiler 这样的分析器,而不是手动编码的东西。

关于java - 测量 Java 方法重构性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7545442/

相关文章:

java - 解码 Java 时出现异常

java - 非 servlet 从 web.xml 获取属性

javascript - 使用 pixi 和 p5 声音库制作的音频 react 视觉效果的性能问题

iphone - 自动发布在 Objective-C 中是如何工作的?

后台运行的Java程序

java - 使用http将数据从android发送到php

performance - 为什么 perl 比 d 语言快?

python - 删除列表中条目的最有效方法

JavaFX ImageView 内存泄漏

memory - 中断向量中中断处理程序的地址为实际地址的+1