Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:基本操作的时间复杂性_Java - Fatal编程技术网

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

我将研究如何在多个线程之间划分大型数组/矩阵计算。但我需要知道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+

问题:您能否提供下一个操作之间的时间关系:

  • +
    *
    /
    操作数(假设为整数类型)
  • 内存访问
  • 启动新线程

对于性能计时,有许多混淆因素。与其试图得到准确的时间安排,不如了解正在发生的事情并尽可能地衡量

将为您提供有关可执行文件的详细统计信息,但请记住,您正在为运行代码的JVM计时,而不仅仅是您的代码

您也可以尝试反汇编程序——最终您会想知道单个操作如何分解为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        
}
$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将在字节码之上执行许多优化。