检查值是否比仅覆盖它更快0?

时间:2015-11-08 19:22:44

标签: java optimization

我们假设我有一个数组,其中包含1到9之间的一些数字,以及包含1到9(1,2,3,... 9)中每个数字的9个元素的另一个数组。我想读取第一个数组中的每个数字,当我读取数字X时,将第二个数组中的X值(将包含在second_array [X-1]中)放到0。 CPU执行此操作会更快:

//size is the size of the first array
int temp = 0;

for(int i; i < size; i++)
{
    temp = first_array[i];
    if(second_array[temp-1] != 0) second_array[temp-1]= 0;
}

或者没有控制的情况:

int temp = 0;

for(int i; i < size; i++)
{
    temp = first_array[i];
    second_array[temp-1]= 0;
}

要明确:是否需要更多时间来控制值或覆盖它?我需要我的代码尽可能快地执行,因此保存的每纳秒都会很有用。提前谢谢。

4 个答案:

答案 0 :(得分:2)

第二个版本更高效,因为不需要检查,这将在循环的每次迭代中发生,并且只有一种情况下产生真。

此外,如果你写下来,你可以进一步提高:

for(int i; i < size; i++)
{
    temp = first_array[i];
}
second_array[size-1]= 0;

答案 1 :(得分:0)

与if条件相比,将数据写入内存总是很快。

原因 - 要比较两个值,您需要先读取它们,然后才需要执行比较。而在其他情况下,您只是将数据写入内存而不关心任何事情。

答案 2 :(得分:0)

如果重复检查该值,它可以缓存在CPU缓存中,并且从那里访问的速度比从主RAM快得多。不同的是,写入值需要此值一直到主存储器可能需要更多时间。写入可能会延迟,但脏缓存行迟早必须刷新。

因此,只重复读取的版本可能比重复写入的版本更快。

答案 3 :(得分:0)

你可以选择:

for(int i = 0; i < size; i++)
{
    second_array[first_array[i]-1]= 0;
}

即使检查更快(我怀疑),如果second_array的很大一部分开始为0,那么只会更快,因为任何非0位置都需要两次操作。

无论如何,找出这类问题答案的最佳方法是使用run it和benchmark!我身边的快速基准测试显示,如果second_array不包含零,则速度降低60%,但当second_array全部为零时速度提高50%!这将使我得出结论,如果超过55%的second_array开始归零,检查会更快。