分配和条件测试之间的性能差异

时间:2014-07-02 18:35:39

标签: java

这个问题专门针对Java语言,但如果是这样,我不介意反馈这是一般概念。我想知道哪个操作可能更快,或者在为变量赋值和执行值测试之间没有区别。对于这个问题,我们可能会有一大串布尔值,这些布尔值会有很多变更请求。我想知道,如果在每次请求期间仅仅更改值的速度进行权衡,那么测试是否需要更改值将被视为浪费。

public static void main(String[] args){
    Boolean array[] = new Boolean[veryLargeValue];
    for(int i = 0; i < array.length; i++) { 
        array[i] = randomTrueFalseAssignment;
    }
    for(int i = 400; i < array.length - 400; i++) { 
        testAndChange(array, i);
    }
    for(int i = 400; i < array.length - 400; i++) {
         justChange(array, i);
    }
}

这可能是testAndChange方法

public static void testAndChange(Boolean[] pArray, int ind) {
    if(pArray) 
        pArray[ind] = false;
}

这可能是justChange方法

public static void justChange(Boolean[] pArray, int ind) {
    pArray[ind] = false;
}

如果我们最终得出极为罕见的情况,即提供给方法的范围内的每个值都是假的,那么一个方法最终会变得比另一个慢吗?是否存在与此类似问题的最佳做法?

编辑:我想添加此内容以帮助澄清这个问题。我意识到数据类型可以作为答案的因素,因为可以使用更大或更有效的数据类型。我更专注于任务本身。是测试的任务&#34; if(aConditionalTest)&#34;没有额外的信息(如数据类型)比分配的任务更慢,更快或更不确定&#34; x = avalue&#34;。

1 个答案:

答案 0 :(得分:0)

正如@TrippKinetics所指出的,这两种方法之间存在语义差异。由于您使用的是Boolean而不是boolean,因此其中一个值可能是null引用。在这种情况下,第一个方法(使用if - 语句)将抛出异常,而第二个方法只是将值分配给数组中的所有元素。

假设您使用boolean[]而不是Boolean[]。优化是一个不可判定的问题。在极少数情况下,添加if - 语句可以提高性能。例如,大多数处理器使用缓存,if - 语句可能导致执行的代码准确存储在两个缓存页面上,而不会导致if更多导致缓存故障。也许您认为您将保存一个赋值指令,但代价是取指令和条件指令(打破CPU流水线)。分配与获取值的成本大致相同。

但是,通常可以假设添加if语句是无用的,并且几乎总是会导致代码变慢。因此,您可以非常安全地声明if语句会降低代码始终

更具体地说,您的问题有更快的方法将范围设置为false。例如使用像以下那样的位向量:

long[] data = new long[(veryLargeValue+0x3f)>>0x06];//a long has 64 bits

//assign random values

int low = 400>>0x06;
int high = (veryLargeValue-400)>>0x06;
data[low] &= 0xffffffffffffffff<<(0x3f-(400&0x3f));
for(int i = low+0x01; i < high; i++) {
    data[i] = 0x00;
}
data[high] &= 0xffffffffffffffff>>(veryLargeValue-400)&0x3f));

优点是处理器可以一次执行32位或64位操作。由于布尔值是一位,通过将位存储到longint,操作可以并行完成。