Java:基本操作的时间复杂性
我将研究如何在多个线程之间划分大型数组/矩阵计算。但我需要知道Java基本操作的相对时间复杂性 例如:Java:基本操作的时间复杂性,java,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
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+
问题:您能否提供下一个操作之间的时间关系:
,+
和*
操作数(假设为整数类型)/
- 内存访问
- 启动新线程
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
}
$javap-ct
从“T.java”编译而来
公共T类{
公共T();
代码:
0:aload_0
1:invokespecial#1//方法java/lang/Object。“:()V
4:返回
公共静态void main(java.lang.String[]);
代码:
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//fieldjava/lang/System.out:Ljava/io/PrintStream;
11:new#3//class java/lang/StringBuilder
14:dup
15:invokespecial#4//方法java/lang/StringBuilder。”“:()V
18:ldc#5//String
20:invokevirtual#6//方法java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
23:iload_1
24:invokevirtual#7//方法java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
27:invokevirtual#8//方法java/lang/StringBuilder.toString:()Ljava/lang/String;
30:invokevirtual#9//方法java/io/PrintStream.println:(Ljava/lang/String;)V
33:返回
}
看看代码#6——这就是实际添加的地方
您需要确定的一件事是您感兴趣的操作如何转化为字节码
在JVM本身中,您可以使用
System.getCurrentTimeMillis()
作为计时方式,但它不会给您提供次毫秒分辨率。您还可以使用System.nanoTime()代码>以获得更高的时间精度(从亚毫秒分辨率的意义上讲),但精度较低。Java不是一个好的工具。我不认为您收集的基准测试在JRE版本之间是一致的。@ElliottFrisch Java8如何优化多线程?您认为我可以用不到600个字符回答这个问题吗?还有,这和你上面的问题有什么关系?我的观点是,优化是定期添加到JVM中的,由于JVM本身就是托管的,因此您将根据许多外部因素得到不同的结果;主机上的负载、JVM的版本、主机的平台、磁盘利用率、内核数等等@VolodymyrBakhmatiuk只有一种方法可以找到:测量。@assylias是的,我完全同意你的看法。我只是想弄清楚我应该测量什么。大小为的数组。关于多少内核等,我想缩小我的estimations@FrobberOfBitsJIT将在字节码之上执行许多优化。