计算机系统结构-延迟转移

来源:互联网 发布:女性情趣用品淘宝 编辑:程序博客网 时间:2024/06/07 06:09
#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;
}

原创粉丝点击