2014-05-05 33 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