以下java/android代码中是否存在性能差异?
问题1:以下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更难手工计算。哪一个应该有更好的性能或相同的性能
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;
}