计算机系统结构-延迟转移
来源:互联网 发布:女性情趣用品淘宝 编辑:程序博客网 时间: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;
}
#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;
}
阅读全文
1 0
- 计算机系统结构-延迟转移
- 计算机系统结构
- 计算机系统结构
- 计算机系统结构
- 计算机系统结构
- 计算机系统概述-计算机系统层次结构
- 计算机系统结构 计算机系统结构的基本概念
- 【计算机系统结构】 计算机系统结构的基本概念
- 计算机系统结构笔记
- 计算机系统结构之浅谈
- 并行计算机系统结构
- 计算机系统层次结构
- 计算机系统结构习题集1
- 计算机系统结构习题集2
- 计算机系统结构概述
- 计算机系统结构(随记)
- 计算机系统层次结构
- 计算机系统结构 存储体系
- Java学习day5
- Spring框架03
- 基于邻接矩阵的图的各种遍历
- NIS安装配置备忘
- JAVA虚拟机系列(七)
- 计算机系统结构-延迟转移
- 算法题目---包含min函数的栈
- Java自动装箱/拆箱
- Java学习day6
- Linq语法详细
- JAVA虚拟机系列(八)
- lintcode--二叉树的后序遍历
- linq join on 多条件
- java基础(三):移位符的运用