我们假设我有一个数组,其中包含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;
}
要明确:是否需要更多时间来控制值或覆盖它?我需要我的代码尽可能快地执行,因此保存的每纳秒都会很有用。提前谢谢。
答案 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
开始归零,检查会更快。