我将对在多个线程之间划分大型数组/矩阵计算进行一些调查。但我需要知道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
比i % 2 == 0
快10+。
问题:您能否在下一次操作之间建立时间关系:
+
,*
和/
个操作数(假设为整数类型)答案 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();
来获得更高的精确时间(从某种意义上说它是低于毫秒的分辨率),但它不太准确。