对于演出时间,有许多混淆因素。不要试图获得准确的时间安排,最好了解正在发生的事情并衡量你能做些什么。
time utility会给你一个可执行文件的详细统计信息,但请记住你正在计算运行代码的JVM的时间,而不仅仅是你的代码。你可能会尝试使用javap反汇编器 - 最终你会想知道你的单个操作是如何分解成java字节码的,以及执行某些关键位所花费的时间。
示例源代码:
public class T {
public static void main(String [] args) {
int x=2;
int y=3;
int z=x+y;
System.out.println(""+x);
}
}
编译,然后拆卸:
$ javap -c T
Compiled from "T.java"
public class T {
public T();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: iconst_2
1: istore_1
2: iconst_3
3: istore_2
4: iload_1
5: iload_2
6: iadd
7: istore_3
8: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
11: new #3 // class java/lang/StringBuilder
14: dup
15: invokespecial #4 // Method java/lang/StringBuilder."<init>":()V
18: ldc #5 // String
20: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
23: iload_1
24: invokevirtual #7 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
27: invokevirtual #8 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
30: invokevirtual #9 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
33: return
}
看代码#6 - 这就是实际添加量正在发生的事情。
您需要确定的一件事是您感兴趣的操作如何转换为字节码。
在JVM本身内部,您可以使用System.getCurrentTimeMillis()
作为计时的一种方式,但它不会为您提供子ms分辨率。您也可以使用System.nanoTime();
来获得更高的精确时间(从某种意义上说它是亚毫秒分辨率),但它不太准确。
Java不是[RTOS](http://en.wikipedia.org/wiki/Real-time_operating_system)。我不希望你收集的基准在JRE版本之间保持一致。 –
@ElliottFrisch Java8如何优化多线程? –
你认为我可以在600字以下回答吗?另外,这与你的问题有什么关系?我的观点是,优化会定期添加到JVM中,并且由于JVM本身托管,因此会根据许多外部因素获得不同的结果;主机上的负载,JVM的版本,主机的平台,磁盘利用率,核心数量等。 –