从方法执行时间中排除垃圾收集时间

时间:2017-03-23 00:44:28

标签: java garbage-collection execution execution-time

我有一个Timer类来测量方法执行时间:

 public class Timer {
            private long startTime;

            public long start()  {
                    startTime=System.currentTimeMillis();
                    return startTime;
            }

            public long getElapsedTime()  {
                    return System.currentTimeMillis()-startTime;
            }
}

我有一个方法可以执行一些内存繁重的操作(比如,将数百万个引用复制到新的不同对象/数百万个对现有对象的引用)。

  public static void Test {
        private static Timer timer=new Timer();
        private static String s0="STRING";
        private static long size=5000_000L;

        public static void main(String[] args)  {
              System.gc();
              foo();
              //bar();  //executed if foo() is commented
        }

        public static void foo()  {
              System.out.println("Foo starts: ");
              timer.start(); 
              for (int i=0; i<size; i++)  {
                   arrayList.add(s0);   
              }
              System.out.println("Foo ends: "+timer.getElapsedTime()+"ms");  
        }     

        public static void bar()  {
            //some code here
        }
}          

执行foo()时,会发生GC。从运行到运行需要不同的时间,例如[Times: user=0.80 sys=0.08, real=0.39 secs]foo()需要1545 ms。然后我有bar()做类似的事情,我想知道它是否同样有效。它需要[Times: user=0.84 sys=0.06, real=0.31 secs]1825 ms

如果我没有足够的RAM来避免在运行期间收集垃圾,我该怎么做才能找出哪种方法有效?我可以像1825-3101545-390一样减去它,然后比较结果吗?

编辑:我单独运行这些方法:一个总是被注释掉。最初使用System.gc()

0 个答案:

没有答案