关于在编码时要保持的性能优化技术

时间:2012-08-15 16:39:00

标签: java

正如我正在研究使用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 个答案:

答案 0 :(得分:1)

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

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

我的探查器会向我展示各种感兴趣的领域

  • CPU热点
  • 内存使用过多(可能在重GC和/或大量交换中出现)
  • 过多的IO(磁盘,网络)

答案 1 :(得分:0)

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

  1. CPU
  2. 所有代堆
  3. 线程正在运行及其状态
  4. 正在创建和处置的对象
  5. 垃圾收集周期
  6. 网络流量
  7. 资源分配和清理
  8. 像这样的微测试很少有用。 JVM使用运行时统计信息来优化性能,因此“刻录”可能是一个问题。

答案 2 :(得分:0)

优化的头号规则是DO NOT。除非你非常准确地知道你在做什么,否则你将优化错误的东西,错过正确的东西,使性能变差,并破坏可靠性和可读性。

专注于编写结构良好,记录完备的紧凑代码。如果以后需要优化,那么完成起来会更容易。

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

答案 3 :(得分:0)

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