我想检查计算机视觉算法的性能,于是我写了这个基本的代码片段来测试哪个循环更快。但是我对结果没有任何解释。通常我得到的结果显示双重循环比简单循环快3倍。如果我交换两个循环,我得到相同的结果,这意味着第二个循环总是被优化了...那么编译器做了什么样的优化呢?
抱歉,我知道这可能是一个愚蠢的问题...
抱歉,我知道这可能是一个愚蠢的问题...
ulong k = 0;
auto start = std::chrono::high_resolution_clock::now();
for( uint i = 0; i < 1000000; ++i )
{
k++;
}
auto diff = std::chrono::high_resolution_clock::now() - start;
auto t1 = std::chrono::duration_cast<std::chrono::nanoseconds>(diff);
k = 0;
start = std::chrono::high_resolution_clock::now();
for( uint i = 0; i < 1000; ++i )
{
for( uint j = 0; j < 1000; ++j )
{
k++;
}
}
diff = std::chrono::high_resolution_clock::now() - start;
auto t2 = std::chrono::duration_cast<std::chrono::nanoseconds>(diff);
CL_PRINT( "Simple: ", t1.count() );
CL_PRINT( "Double: ", t2.count() );
如果我交换这两个循环,得到的结果是相同的,这意味着第二个循环总是被优化了...
请注意,CL_PRINT
只是用于调试目的的宏。
还要注意,我使用以下选项编译代码:-O3 -msse4.1
-O3
优化级别下,如果编译器发现变量k
的值从未被使用,它可能会重构代码。 - unwindk = 0;
意味着这个计算不需要了。 - j_random_hacker