2014-05-05 32 views
-1

我將對在多個線程之間劃分大型數組/矩陣計算進行一些調查。但是我需要知道Java基本操作的相對時間複雜性。Java:基本操作的時間複雜度

例如:

int a = 23498234; 
int b = -34234; 
int[] array = new int[10000]; 
int c = a + b; // 1 
int c = array[234]; // 2 
String 1 (summary of two integers) is 10+ times faster than string 2 (memory access) 

(i & 1) == 0是10+比i % 2 == 0更快。

問:能在下一個操作之間你supppose時間關係:

  • +*/操作數
  • 內存訪問
  • (整型類型假設)開始新的線程
+2

Java不是[​​RTOS](http://en.wikipedia.org/wiki/Real-time_operating_system)。我不希望你收集的基準在JRE版本之間保持一致。 –

+0

@ElliottFrisch Java8如何優化多線程? –

+0

你認爲我可以在600字以下回答嗎?另外,這與你的問題有什麼關係?我的觀點是,優化會定期添加到JVM中,並且由於JVM本身託管,因此會根據許多外部因素獲得不同的結果;主機上的負載,JVM的版本,主機的平臺,磁盤利用率,核心數量等。 –

回答

1

對於演出時間,有許多混淆因素。不要試圖獲得準確的時間安排,最好了解正在發生的事情並衡量你能做些什麼。

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();來獲得更高的精確時間(從某種意義上說它是亞毫秒分辨率),但它不太準確。

+0

Java8如何優化多線程? –

+0

我不知道 - 這是一個單獨的問題,我確信它有幾種不同的方法。 – FrobberOfBits

+0

@FrobberOfBits JIT將在字節碼之上執行許多優化。 – assylias