我有3个功能归结为以下代码,可运行800x800次:
下面的每个while
循环在iter1 == lim
之前正好运行800次,因此对持续时间的测量是运行800x800x800(5.1亿)次。iter1
,iter2
和lim
是double
指针。它们指向double
的足够大的向量。sum
是double
局部变量。s1
和s2
是本地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秒内运行。显然,性能下降与添加到
iter1
和iter2
的数量有关。我不是处理器访问内存和取消引用指针方面的专家,所以我希望社区中的某人比我了解更多,并愿意对我的问题有所了解。如果您需要有关我运行这些测试的硬件的任何信息,或者其他可能有用的信息,请随时在评论中提问。
编辑:问题是第二个函数与其他函数相比速度较慢,并且想知道是否有什么我可以做的才能使其更快地运行,因为它似乎在做其他两个函数。
编辑2:所有的测量都在发布版本中进行
最佳答案
这只是数据局部性的体现。
与在第800页的下一页相比,花时间更少地看书的下一页。在家尝试一下。