IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> 增加Cache命中率加快程序运行速度 -> 正文阅读

[系统运维]增加Cache命中率加快程序运行速度

场景一:改变程序运行顺序以提高Cache命中率

给定代码逻辑:当条件A成立,则执行B;否则执行C。

if (cond A) {
    // do sth. B
} else {
    // do sth. C
}

CPU分支预测器机制:对于if条件语句,如果CPU可以预测到接下来执行的是if还是else里的指令,就可以提前将指令加载到缓存中,这样CPU就可以直接从Cache读取到指令,以加快执行速度。

下面代码给出两个操作逻辑:数组遍历和排序。

uint32_t a[100] = {0U};
// do sth, to assign random value to a
...
...
// for and if logic
for (size_t i = 0U; i < 100U; i++) {
    if (a[i] < 50U) {
        a[i] = 0U;
    }
}
sort(a, a +100);

先执行排序,后执行数组遍历,程序运行速度更快
原因是:排序之后,数组内元素从小到大按顺序排列,则前几次循环命中if的次数较多,于是分支预测会将a[i] = 0指令缓存到Cache中,后续CPU执行该指令只需要直接加载即可。

场景二:Linux通过宏定义提高优先级

编码在编码阶段,已经可以确定某个分支大概率命中,则可以通过likely和unlikely宏指定优先级。

likely与unlikely宏

在linux/compiler中有如下宏定义:

#define likely(x)   __builtin_expect(!!(x), 1) // 表示x为真的可能性较大
#define unlikely(x) __builtin_expect(!!(x), 0) // 表示x为假的可能性较大

其中,__builtin_expect()函数是gcc(version>= 2.96)引入的内建函数,目的是将“分支转移”的信息提供给编译器,这样编译器可以对代码进行优化,以减少指令跳转所带来的性能下降问题。

__builtin_expect函数

函数原型如下:

long __builtin_expect(long exp, long c);

其中,exp为一个表达式,c为一个编译期常量。则上述likely宏的定义则表示,!!(x) == 1的概率较大。

编码时,可使用如下两种写法,表示(a == 1)成立的概率较大,告诉CPU提前将指令A缓存起来。

// 写法一
if (__builtin_expect((a == 1), 1) {
    // do sth. A
} else {
    // do sth. B
}
// 写法二
if (likely(a == 1)) {
    // do sth. A
} else {
    // do sth. B
}

场景三:通过绑核增加缓存命中率

现代CPU都是多核心,进程运行时在不同核之间切换,导致缓存命中率下降。Linux上提供了sched_setaffinity方法进行绑核。

#define _GNU_SOURCE
#include <sched.h>
// function return 0 for success and -1 for failure
int sched_setaffinity(pid_t pid, size_t cpusetsize,
    const cpu_set_t *mask);
int sched_getaffinity(pid_t pid, size_t cpusetsize,
    cpu_set_t *mask);

参考资料:
(1)https://blog.csdn.net/qq_34827674/article/details/109147330?spm=1001.2014.3001.5502
(2)https://blog.csdn.net/fan_hai_ping/article/details/8435151
(3)https://man7.org/linux/man-pages/man2/sched_setaffinity.2.html
(4)https://www.cnblogs.com/LubinLew/p/GCC-__builtin_expect.html

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-07-26 12:24:56  更:2021-07-26 12:27:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 16:57:08-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码