#include <iostream>
#include <tr1/random>
#include <chrono>
#include <algorithm>
/*!
*延迟转移:CPU在执行条件判断的时候为了保证管线的流水,会
* 对指定进行预判执行,如果判断成功则流程继续,否则判断失败
* 会从条件判断正确的地方加载代码到流水管线中执行
* (从数据可见,有时候我们在for循环中使用判断逻辑的时候,如果
* 能增加判断概率是可以提高性能的,之前为认为肯定是不排序快,
* 实际情况是排序比不排序快),一半如果预判错误导致的代价会
* 慢10~20个CPU的时钟周期。
*
* 测试结果
=========DEBUG=========
统计数据量:32768
未排序的执行效率
sum=3.1558e+06 耗时=14115322ns
采用算数计算的效率
sum=3.1558e+06 耗时=256719ns
排序后的执行效率
sum=3.1558e+06 耗时=352787ns
========Release==========
统计数据量:32768
未排序的执行效率
sum=3.1558e+06 耗时=214899ns
采用算数计算的效率
sum=3.1558e+06 耗时=102112ns
排序后的执行效率
sum=3.1558e+06 耗时=85363ns
=========DEBUG=========
统计数据量:3276800
未排序的执行效率
sum=3.13909e+08 耗时=28667409ns
采用算数计算的效率
sum=3.13909e+08 耗时=17505613ns
排序后的执行效率
sum=3.13909e+08 耗时=10849481ns
========Release==========
统计数据量:3276800
未排序的执行效率
sum=3.13909e+08 耗时=15279232ns
采用算数计算的效率
sum=3.13909e+08 耗时=6613931ns
排序后的执行效率
sum=3.13909e+08 耗时=3994277ns
*/
using namespace std;
static constexpr int ArraySize = 3276800;
typedef unsigned char ValueType;
void sumPerformance(const char *desc, ValueType* arr)
{
chrono::system_clock::time_point t1 = chrono::system_clock::now();
cout<<desc<<endl;
double sum {0};
for(int i=0; i<ArraySize; ++i)
{
if(arr[i] >= 128)
{
sum += arr[i];
}
}
chrono::system_clock::duration d = (chrono::system_clock::now() - t1 );
cout<<"sum="<<sum<<" 耗时="<<d.count()<<"ns"<<endl;
}
void sumPerformance2(const char *desc, ValueType* arr)
{
chrono::system_clock::time_point t1 = chrono::system_clock::now();
cout<<desc<<endl;
double sum {0};
for(int i=0; i<ArraySize; ++i)
{
ValueType v = (arr[i] - 128) >> 31;
sum += ~v & arr[i] ;
}
chrono::system_clock::duration d = (chrono::system_clock::now() - t1 );
cout<<"sum="<<sum<<" 耗时="<<d.count()<<"ns"<<endl;
}
int main()
{
ValueType arr[ArraySize];
std::tr1::mt19937 mt19937;
for_each(arr, arr+ArraySize, [&](ValueType & val) { val = static_cast<ValueType>(mt19937()); });
random_shuffle(arr, arr + ArraySize);
#if defined(_DEBUG)
cout<<"=========DEBUG========="<<endl;
#else
cout<<"========Release=========="<<endl;
#endif
cout<<"统计数据量:"<<ArraySize<<endl;
sumPerformance("未排序的执行效率", arr);
sumPerformance2("采用算数计算的效率", arr);
std::sort(arr, arr + ArraySize);
sumPerformance("排序后的执行效率", arr);
return 0;
}
#include <tr1/random>
#include <chrono>
#include <algorithm>
/*!
*延迟转移:CPU在执行条件判断的时候为了保证管线的流水,会
* 对指定进行预判执行,如果判断成功则流程继续,否则判断失败
* 会从条件判断正确的地方加载代码到流水管线中执行
* (从数据可见,有时候我们在for循环中使用判断逻辑的时候,如果
* 能增加判断概率是可以提高性能的,之前为认为肯定是不排序快,
* 实际情况是排序比不排序快),一半如果预判错误导致的代价会
* 慢10~20个CPU的时钟周期。
*
* 测试结果
=========DEBUG=========
统计数据量:32768
未排序的执行效率
sum=3.1558e+06 耗时=14115322ns
采用算数计算的效率
sum=3.1558e+06 耗时=256719ns
排序后的执行效率
sum=3.1558e+06 耗时=352787ns
========Release==========
统计数据量:32768
未排序的执行效率
sum=3.1558e+06 耗时=214899ns
采用算数计算的效率
sum=3.1558e+06 耗时=102112ns
排序后的执行效率
sum=3.1558e+06 耗时=85363ns
=========DEBUG=========
统计数据量:3276800
未排序的执行效率
sum=3.13909e+08 耗时=28667409ns
采用算数计算的效率
sum=3.13909e+08 耗时=17505613ns
排序后的执行效率
sum=3.13909e+08 耗时=10849481ns
========Release==========
统计数据量:3276800
未排序的执行效率
sum=3.13909e+08 耗时=15279232ns
采用算数计算的效率
sum=3.13909e+08 耗时=6613931ns
排序后的执行效率
sum=3.13909e+08 耗时=3994277ns
*/
using namespace std;
static constexpr int ArraySize = 3276800;
typedef unsigned char ValueType;
void sumPerformance(const char *desc, ValueType* arr)
{
chrono::system_clock::time_point t1 = chrono::system_clock::now();
cout<<desc<<endl;
double sum {0};
for(int i=0; i<ArraySize; ++i)
{
if(arr[i] >= 128)
{
sum += arr[i];
}
}
chrono::system_clock::duration d = (chrono::system_clock::now() - t1 );
cout<<"sum="<<sum<<" 耗时="<<d.count()<<"ns"<<endl;
}
void sumPerformance2(const char *desc, ValueType* arr)
{
chrono::system_clock::time_point t1 = chrono::system_clock::now();
cout<<desc<<endl;
double sum {0};
for(int i=0; i<ArraySize; ++i)
{
ValueType v = (arr[i] - 128) >> 31;
sum += ~v & arr[i] ;
}
chrono::system_clock::duration d = (chrono::system_clock::now() - t1 );
cout<<"sum="<<sum<<" 耗时="<<d.count()<<"ns"<<endl;
}
int main()
{
ValueType arr[ArraySize];
std::tr1::mt19937 mt19937;
for_each(arr, arr+ArraySize, [&](ValueType & val) { val = static_cast<ValueType>(mt19937()); });
random_shuffle(arr, arr + ArraySize);
#if defined(_DEBUG)
cout<<"=========DEBUG========="<<endl;
#else
cout<<"========Release=========="<<endl;
#endif
cout<<"统计数据量:"<<ArraySize<<endl;
sumPerformance("未排序的执行效率", arr);
sumPerformance2("采用算数计算的效率", arr);
std::sort(arr, arr + ArraySize);
sumPerformance("排序后的执行效率", arr);
return 0;
}