我有一个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-310
和1545-390
一样减去它,然后比较结果吗?
编辑:我单独运行这些方法:一个总是被注释掉。最初使用System.gc()
。