【发布时间】:2016-04-05 04:52:39
【问题描述】:
以下代码显示了我机器上min_3 的两个版本(Windows 7,VC++ 2015,发行版)的巨大性能差异。
#include <algorithm>
#include <chrono>
#include <iostream>
#include <random>
template <typename X>
const X& max_3_left( const X& a, const X& b, const X& c )
{
return std::max( std::max( a, b ), c );
}
template <typename X>
const X& max_3_right( const X& a, const X& b, const X& c )
{
return std::max( a, std::max( b, c ) );
}
int main()
{
std::random_device r;
std::default_random_engine e1( r() );
std::uniform_int_distribution<int> uniform_dist( 1, 6 );
std::vector<int> numbers;
for ( int i = 0; i < 1000; ++i )
numbers.push_back( uniform_dist( e1 ) );
auto start1 = std::chrono::high_resolution_clock::now();
int sum1 = 0;
for ( int i = 0; i < 1000; ++i )
for ( int j = 0; j < 1000; ++j )
for ( int k = 0; k < 1000; ++k )
sum1 += max_3_left( numbers[i], numbers[j], numbers[k] );
auto finish1 = std::chrono::high_resolution_clock::now();
std::cout << "left " << sum1 << " " <<
std::chrono::duration_cast<std::chrono::microseconds>(finish1 - start1).count()
<< " us" << std::endl;
auto start2 = std::chrono::high_resolution_clock::now();
int sum2 = 0;
for ( int i = 0; i < 1000; ++i )
for ( int j = 0; j < 1000; ++j )
for ( int k = 0; k < 1000; ++k )
sum2 += max_3_right( numbers[i], numbers[j], numbers[k] );
auto finish2 = std::chrono::high_resolution_clock::now();
std::cout << "right " << sum2 << " " <<
std::chrono::duration_cast<std::chrono::microseconds>(finish2 - start2).count()
<< " us" << std::endl;
}
输出:
left 739861041 796056 us
right 739861041 1442495 us
在ideone 上,差异较小但仍不可忽略。
为什么会存在这种差异?
【问题讨论】:
-
尝试比较编译器的汇编输出。
-
g++ 5.2.1 -O2 上的类似结果
-
你试过先右后左,看看时间是否不变?
-
可能不是答案,但编译器可能会优化所有循环,因为您的代码有效地计算
sum1=max_3_left(numbers[999], numbers[999], numbers[999]);和,即sum1=numbers[999];。如果您将sum1=更改为sum1+=和sum2=会怎样? -
@DanielLangr:感谢您的评论。我现在将代码从
sum =更改为sum +=。差别还是一样的。
标签: c++ performance visual-c++