以下java/android代码中是否存在性能差异?

以下java/android代码中是否存在性能差异?,java,performance,colon,Java,Performance,Colon,问题1: Case 1a: private int method1a(int x, int y, int z){ return 1 + (x-y)/z; //int division here } Case 1b: private int method1b(int x, int y, int z){ return (x-y)/z + 1; //int division here } 在我看来,1+a的主要区别似乎比a+1更难手工计算。哪一个应该有更好的性能或相同的性能

问题1:

Case 1a:
private int method1a(int x, int y, int z){
    return 1 + (x-y)/z;   //int division here
}

Case 1b:
private int method1b(int x, int y, int z){
    return (x-y)/z + 1;   //int division here
}
在我看来,1+a的主要区别似乎比a+1更难手工计算。哪一个应该有更好的性能或相同的性能

//

问题2:

private r_temp;
private q_temp;
private int method2a(int x, int y, int z){
    r_temp = x%y;
    q_temp = x/y;
    if (y<z) return 0;
    else return (r_temp>0)? q_temp+1 : q_temp;
}

private int method2b(int x, int y, int z){
    int r = x%y;
    int q = x/y;
    if (y<z) return 0;
    else return (r>0)? q+1 : q;
}
性能和内存哪个更好

我问这些问题,因为我可能需要在几秒钟内重复此功能数百次。

TL;DR

第一季度和第二季度可能没有,第三季度可能有。但你可能在浪费时间,甚至考虑这个


首先,我不认为Q1和Q21有任何区别。此外,如果更早(或更晚)进行除法有任何性能优势,那么我希望本机代码编译器将生成以相同的最佳顺序对这两种情况执行操作的代码。(这将是一个简单的优化。)

其次,如果有任何区别的话,它将只是几个硬件时钟周期,这在现代机器上意味着几纳秒。对于大多数应用程序,这将是几纳秒太小而不重要。事实上,几毫秒往往太小而不重要

我问这些问题,因为我可能需要在几秒钟内重复此功能数百次

即使在1秒内重复1000次,也只能节省几微秒的时间。这比人类注意到任何差异的阈值低1000倍

(好吧……有些领域甚至几纳秒都很重要。但你不会在Android应用程序中进行高频期权交易。)

1-对于Q3,存在差异,但这是因为
method3a
method3b
之间存在语义差异。实际上,您应该在这两个版本之间进行选择,主要是在这两个版本上分配所需的语义。性能是次要问题


经验教训:

  • 在您真正具备微优化经验并了解编译器的实际工作方式之前,在优化时依靠直觉是不明智的。人们对这些事情的直觉往往是错误的

  • 避免过早优化的陷阱。这通常是浪费时间。。。或者更糟。特别是在这个层次上

  • 当你决定何时进行优化时,要科学地进行。首先让应用程序代码正常工作。为应用程序创建一个现实的性能基准。为自己设定绩效目标。使用分析器找出代码中真正的性能瓶颈/热点在哪里。一次优化一个,并使用您的基准测试每一次优化是否产生了有价值的差异。当你达到目标时停止


  • 这种优化是(程序员)耗时的。在大多数情况下,程序员的时间通常最好花在其他事情上

    一般而言:

    • 编译器在优化方面将比大多数程序员更好(更可靠)

    • 与程序员的时间不同,编译器的时间基本上是免费的

    • 下一代编译器通常会有更好的优化器

    • 在不同的硬件平台上,最佳代码实际上可能是不同的。JIT编译器可以处理这个问题,但是为不同的硬件平台提供不同的源代码是维护的噩梦

    • 最佳代码实际上可能取决于代码在运行时的使用方式;e、 g.最常采用的代码路径。JIT编译器可以收集统计数据以允许它处理此问题。在源代码中这样做是。。。很难


    为什么不自己测试一下呢?我不知道这是取决于硬件还是取决于代码,所以我问这个。。
    private int[] ints = new int[2];
    private method3b(int x,int y){
        return new int[2] {x+1, y+1}
    }
    
    private method3b(int x,int y){
        ints[0] = x+1; 
        ints[1] = y+1; 
        return ints;
    }