對於演出時間,有許多混淆因素。不要試圖獲得準確的時間安排,最好了解正在發生的事情並衡量你能做些什麼。
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的版本,主機的平臺,磁盤利用率,核心數量等。 –