0

当我正在研究通过使用 System.currentTimeinMillis() 来测量 Java 中经过的执行时间时,如果代码如下所示,但我的查询是我们在编码时除了测量时间之外还应该记住的其他性能技术,我的查询更多地集中在性能优化技术上。

    public class MeasureTimeExampleJava {



    public static void main(String args[]) {

        //measuring elapsed time using System.nanoTime
        long startTime = System.nanoTime();
        for(int i=0; i< 1000000; i++){
            Object obj = new Object();
        }
        long elapsedTime = System.nanoTime() - startTime;

        System.out.println("Total execution time to create 1000K objects in Java in millis: "
                + elapsedTime/1000000);

        //measuring elapsed time using Spring StopWatch
        StopWatch watch = new StopWatch();
        watch.start();
        for(int i=0; i< 1000000; i++){
            Object obj = new Object();
        }
        watch.stop();
        System.out.println("Total execution time to create 1000K objects in Java using StopWatch in millis: "
                + watch.getTotalTimeMillis());
    }   

}

Output:
Total execution time to create 1000K objects in Java in millis: 18
Total execution time to create 1000K objects in Java using StopWatch in millis: 15
4

4 回答 4

1

以下是我在尝试优化代码时采取的步骤:

  • 使用架构/设计的最佳实践
  • 编写易于维护的代码
  • 使用分析器测量结果
  • 只优化分析器认为需要注意的部分代码
  • 只花时间优化会影响程序实际用户的东西

我的分析器将向我展示各种感兴趣的领域

  • CPU 热点
  • 内存使用过多(可能表现为大量 GC 和/或大量交换)
  • 过多的 IO(磁盘、网络)
于 2012-08-15T16:41:04.650 回答
0

您正在测试两种不同的测量经过时间的方法。您的测试存在缺陷,因为您在同一个 JVM 执行中运行这两个测试。这冒着第一次测试预热缓存并影响第二次测试的风险。正确的方法是在自己的 JVM 执行中运行每个测试。

于 2012-08-15T22:38:03.610 回答
0

我想说你应该关心很多其他的事情,所有这些都应该可以通过像 Visual VM 这样的工具来访问:

  1. 中央处理器
  2. 所有代的堆
  3. 正在运行的线程及其状态
  4. 正在创建和处理的对象
  5. 垃圾收集周期
  6. 网络流量
  7. 资源分配和清理

像这样的微测试很少有帮助。JVM 使用运行时统计信息来优化性能,因此“老化”可能是一个问题。

于 2012-08-15T16:40:56.697 回答
0

优化的第一条规则是不要。除非您非常准确地知道自己在做什么,否则您将优化错误的东西,错过正确的东西,使性能变差,并破坏可靠性和可读性。

专注于编写结构良好、文档齐全、紧凑的代码。如果以后需要优化,完成起来会容易得多。

(请注意,用new Object()Java 测量性能是一项愚蠢的差事。垃圾收集器是房间里 800 磅的大猩猩,所以你所有的测量都是无用的。)

于 2012-08-15T16:49:10.547 回答