我试图用类似的块来检查执行的时间。
示例代码和输出如下,
public class Tester {
public static void main(String[] args) {
System.out.println("Run 1");
List<Integer> list = new ArrayList<>();
int i = 0;
long st = System.currentTimeMillis();
while (++i < 10000) {
list.add(i);
}
System.out.println("Time taken :" + (System.currentTimeMillis() - st));
System.out.println("Run 2");
int j = 0;
List<Integer> list2 = new ArrayList<>();
long ST = System.currentTimeMillis();
while (++j < 10000) {
list2.add(j);
}
System.out.println("Time taken :" + (System.currentTimeMillis() - ST));
System.out.println("Run 3");
int k = 0;
List<Integer> list3 = new ArrayList<>();
long ST2 = System.currentTimeMillis();
while (++k < 10000) {
list3.add(k);
}
System.out.println("Time taken :" + (System.currentTimeMillis() - ST2));
}
}
输出
Run 1
Time taken :6
Run 2
Time taken :3
Run 3
Time taken :1
为什么我会有不同的执行时间?
答案 0 :(得分:1)
这可能是在阵列列表上进行即时编译和热点优化,但你无法100%确定。
除此之外,您的样本量太小而不显着。
答案 1 :(得分:1)
a)由于java代码被编译为字节码,因此对代码进行了一些优化,无论如何这可能与您的观察没有关系
b)由于例如JVM延迟加载或CPU缓存,每个后续类似操作都有更好的执行时间,直到jvm为该操作“预热”为止。
c)如果您想尝试基准测试,请查看Java Microbenchmark线束(JMH)