这个问题专门针对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;。
答案 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位操作。由于布尔值是一位,通过将位存储到long
或int
,操作可以并行完成。