编辑:maaartinus给出了我正在寻找的答案,而tmyklebu关于这个问题的数据帮助了很多,所以谢谢两者!:)
我已经阅读了一些关于HotSpot如何在代码中注入一些"内在函数"的内容,特别是对于Java标准Math libs(来自这里)
所以我决定尝试一下,看看HotSpot可以直接做出多大的反对(特别是因为我听说min/max可以编译成无分支的asm).
public static final int max ( final int a, final int b )
{
if ( a > b )
{
return a;
}
return b;
}
Run Code Online (Sandbox Code Playgroud)
这是我的实施.从另一个SO问题我已经读过,使用三元运算符使用额外的寄存器,我没有发现在执行if块和使用三元运算符之间存在显着差异(即返回(a> b)?a:b).
分配一个8Mb的int数组(即200万个值)并随机化它,我做了以下测试:
try ( final Benchmark bench = new Benchmark( "millis to max" ) )
{
int max = Integer.MIN_VALUE;
for ( int i = 0; i < array.length; ++i )
{
max = OpsMath.max( max, array[i] );
// max = Math.max( max, array[i] );
} …
Run Code Online (Sandbox Code Playgroud) 我正在InterviewBit上尝试关于数组的问题.在这个问题中,我创建了一个内联函数,返回整数的绝对值.但有人告诉我,我的算法在提交时效率不高.但当我改为使用abs()
C++库时,它给出了正确的答案判决.
这是我的功能得到了一个低效的判决 -
inline int abs(int x){return x>0 ? x : -x;}
int Solution::coverPoints(vector<int> &X, vector<int> &Y) {
int l = X.size();
int i = 0;
int ans = 0;
while (i<l-1){
ans = ans + max(abs(X[i]-X[i+1]), abs(Y[i]-Y[i+1]));
i++;
}
return ans;
}
Run Code Online (Sandbox Code Playgroud)
这是得到正确答案的那个-
int Solution::coverPoints(vector<int> &X, vector<int> &Y) {
int l = X.size();
int i = 0;
int ans = 0;
while (i<l-1){
ans = ans + max(abs(X[i]-X[i+1]), abs(Y[i]-Y[i+1])); …
Run Code Online (Sandbox Code Playgroud) 我有两个类似的实现(java和c ++)用于像选择排序这样的简单算法.
public interface SortingAlgorithm {
public void sort(int[] a);
}
public class SelectionSort implements SortingAlgorithm {
@Override
public void sort(int[] a) {
for (int i = 0; i < a.length; i++) {
int lowerElementIndex = i;
for (int j = i + 1; j < a.length; j++) {
if (a[j] < a[lowerElementIndex]) {
lowerElementIndex = j;
}
}
swap(a, lowerElementIndex, i);
}
}
private void swap(int[] a, int i, int j) {
if (i == j) {
return;
} …
Run Code Online (Sandbox Code Playgroud)