【发布时间】:2020-06-10 12:35:20
【问题描述】:
在下面的代码中,我有 2 个嵌套的 for 循环。第二个交换了 for 循环的顺序,运行速度明显更快。
这纯粹是缓存局部性问题(第一个代码在向量上循环多次,而第二个代码在向量上循环一次),还是有其他我不理解的问题?
int main()
{
using namespace std::chrono;
auto n = 1 << 12;
vector<int> v(n);
high_resolution_clock::time_point t1 = high_resolution_clock::now();
for(int i = 0; i < (1 << 16); ++i)
{
for(const auto val : v) i & val;
}
high_resolution_clock::time_point t2 = high_resolution_clock::now();
duration<double> time_span = duration_cast<duration<double>>(t2 - t1);
std::cout << "It took me " << time_span.count() << " seconds.";
std::cout << std::endl;
t1 = high_resolution_clock::now();
for(const auto val : v)
{
for(int i = 0; i < (1 << 16); ++i) i & val;
}
t2 = high_resolution_clock::now();
time_span = duration_cast<duration<double>>(t2 - t1);
std::cout << "It took me " << time_span.count() << " seconds.";
std::cout << std::endl;
}
【问题讨论】:
-
您是否在反汇编程序中验证了编译器并没有简单地优化掉一些循环?
-
@cdhowie。不,我不知道该怎么做,因为我以前从未看过汇编代码。你有参考吗?
-
See here -- gcc 和 clang 都优化了
-O3的两个循环。它实际上没有测量任何东西。 -
现在的编译器已经相当不错了。在进行基准测试时,您必须将结果用于某事,并使其足够困难,以使编译器不会缩短您的计算并简单地预先计算结果。
-
@lamanon 不,没有