Java:基本操作的时间复杂度

时间:2014-05-05 16:46:53

标签: 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) == 0i % 2 == 0快10+。

问题:您能否在下一次操作之间建立时间关系:

  • +*/个操作数(假设为整数类型)
  • 内存访问
  • 开始新主题

1 个答案:

答案 0 :(得分: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()作为计时方式,但它不会为您提供sub-ms分辨率。您还可以使用System.nanoTime();来获得更高的精确时间(从某种意义上说它是低于毫秒的分辨率),但它不太准确。