public static void main(String[] args) {
int sum = 0;
for(int i = 0; i < 100; i++){
long startTime = System.currentTimeMillis();
Tika tika = new Tika();
long endTime = System.currentTimeMillis();
long num = endTime - startTime;
sum += num;
System.out.println("程序初始化时间: " + num + "ms");
}
System.out.println("平均耗费时间为:" + sum/100);
}
这样写对吗,为什么第一次对象初始化的时间比后面大了这么多,是什么原因
程序初始化时间: 914ms
程序初始化时间: 14ms
程序初始化时间: 28ms
程序初始化时间: 23ms
程序初始化时间: 11ms
程序初始化时间: 12ms
程序初始化时间: 11ms
程序初始化时间: 10ms
程序初始化时间: 11ms
程序初始化时间: 10ms
程序初始化时间: 9ms
程序初始化时间: 10ms
程序初始化时间: 8ms
程序初始化时间: 9ms
程序初始化时间: 8ms
程序初始化时间: 31ms
程序初始化时间: 14ms
程序初始化时间: 12ms
程序初始化时间: 10ms
程序初始化时间: 12ms
程序初始化时间: 18ms
程序初始化时间: 14ms
程序初始化时间: 27ms
程序初始化时间: 8ms
程序初始化时间: 10ms
程序初始化时间: 9ms
程序初始化时间: 10ms
程序初始化时间: 9ms
程序初始化时间: 7ms
程序初始化时间: 10ms
程序初始化时间: 10ms
程序初始化时间: 10ms
程序初始化时间: 15ms
程序初始化时间: 9ms
程序初始化时间: 8ms
程序初始化时间: 9ms
程序初始化时间: 8ms
程序初始化时间: 8ms
程序初始化时间: 7ms
程序初始化时间: 6ms
程序初始化时间: 7ms
程序初始化时间: 12ms
程序初始化时间: 8ms
程序初始化时间: 7ms
程序初始化时间: 6ms
程序初始化时间: 8ms
程序初始化时间: 7ms
程序初始化时间: 8ms
程序初始化时间: 7ms
程序初始化时间: 8ms
程序初始化时间: 8ms
程序初始化时间: 6ms
程序初始化时间: 7ms
程序初始化时间: 6ms
程序初始化时间: 24ms
程序初始化时间: 8ms
程序初始化时间: 9ms
程序初始化时间: 11ms
程序初始化时间: 7ms
程序初始化时间: 8ms
程序初始化时间: 7ms
程序初始化时间: 8ms
程序初始化时间: 14ms
程序初始化时间: 10ms
程序初始化时间: 9ms
程序初始化时间: 6ms
程序初始化时间: 11ms
程序初始化时间: 44ms
程序初始化时间: 10ms
程序初始化时间: 6ms
程序初始化时间: 8ms
程序初始化时间: 7ms
程序初始化时间: 7ms
程序初始化时间: 6ms
程序初始化时间: 7ms
程序初始化时间: 7ms
程序初始化时间: 6ms
程序初始化时间: 7ms
程序初始化时间: 6ms
程序初始化时间: 9ms
程序初始化时间: 6ms
程序初始化时间: 7ms
程序初始化时间: 6ms
程序初始化时间: 11ms
程序初始化时间: 9ms
程序初始化时间: 12ms
程序初始化时间: 7ms
程序初始化时间: 14ms
程序初始化时间: 5ms
程序初始化时间: 6ms
程序初始化时间: 6ms
程序初始化时间: 5ms
程序初始化时间: 8ms
程序初始化时间: 6ms
程序初始化时间: 6ms
程序初始化时间: 11ms
程序初始化时间: 9ms
程序初始化时间: 7ms
程序初始化时间: 5ms
程序初始化时间: 5ms
平均耗费时间为:18
平均耗费时间为:18
我一般是用平均值作为耗费时间的。次数要多,100次可能不够。看需要次数跑多一点。
第一次实例化时间那么长的原始是因为 JVM 里面还没有 Tika 类,于是 JVM 需要将这个类装载进虚拟机,因为 JVM 不是一开始就把所有的类都加载进内存中,而是只有第一次遇到某个需要运行的类时才会加载,且只加载一次。在 new Tika()之前,Tika 类还经历了 装载 -> 验证 -> 准备 -> 解析 直到 new Tika()初始化。
这些在《深入理解 Java 虚拟机》这本书里面都有讲,下面这篇博客也讲得很详细:
https://blog.csdn.net/javazejian/article/details/73413292