我有3个功能归结为以下代码,可运行800x800次:

下面的每个while循环在iter1 == lim之前正好运行800次,因此对持续时间的测量是运行800x800x800(5.1亿)次。

iter1iter2limdouble指针。它们指向double的足够大的向量。

sumdouble局部变量。

s1s2是本地unsigned int,均等于800。

第一次运行需要2.257秒:

while ( iter1 < lim )
{
    sum += *iter1 * *iter2;
    ++iter1;
    iter2 += s2;
}


秒在7.364秒内运行:

while ( iter1 < lim )
{
    sum += *iter1 * *iter2;
    iter1 += s1;
    iter2 += s2;
}


第三次跑1.355秒:

while ( iter1 < lim )
{
    sum += *iter1 * *iter2;
    ++iter1;
    ++iter2;
}


如果我从每个命令中删除sum += *iter1 * *iter2;指令,它们都将在大约1.07秒内运行。

如果删除第二个乘法并将指令更改为sum += *iter1;,则第一个和第三个运行在1.33秒内,而第二个运行在1.46秒内。

如果删除另一个迭代器,例如:sum += *iter2;,则第一个和第二个迭代器将在2.2秒内运行,而第三个和第二个迭代器将在1.35秒内运行。

显然,性能下降与添加到iter1iter2的数量有关。我不是处理器访问内存和取消引用指针方面的专家,所以我希望社区中的某人比我了解更多,并愿意对我的问题有所了解。

如果您需要有关我运行这些测试的硬件的任何信息,或者其他可能有用的信息,请随时在评论中提问。

编辑:问题是第二个函数与其他函数相比速度较慢,并且想知道是否有什么我可以做的才能使其更快地运行,因为它似乎在做其他两个函数。

编辑2:所有的测量都在发布版本中进行

最佳答案

这只是数据局部性的体现。
与在第800页的下一页相比,花时间更少地看书的下一页。在家尝试一下。

09-07 07:48