Cache命中:性能优化实记之Cache命中对CPU运行性能的影响

情景描述

先上代码:

  • code1:
void Graph::shufle(int cnt) {
    for (int i = 1; i<cnt; i++) {
        unsigned int swid = fastrand() % (cnt-i)  ;
        std::swap(iCons[cnt - i], iCons[swid]);
        std::swap(jCons[cnt - i], jCons[swid]);
        std::swap(dCons[cnt - i], dCons[swid]);
        std::swap(wCons[cnt - i], wCons[swid]);
    }
}
  • code2
// 作用为快速取得随机数
unsigned int g_seed = 0;
unsigned int fastrand() {
    g_seed = (214013 * g_seed + 2531011);
    return g_seed;
}
  • code3
// 与代码2的区别在于取值范围变为了65535
unsigned int fastrand() {
    g_seed = (214013 * g_seed + 2531011);
    return (g_seed >>16) & &7FFF;
}

实际效果:

  • cnt : 107403264
  • code2 timeuse : 3489 ms
  • code3 timeuse : 984 ms

分析

两种代码实现结果相差接近3.5倍,起初怀疑是取模造成的。怀疑在-O3的编译器优化下,较小的值取模往往可以直接返回该值本身。将code1中swap去掉后发现,就算是code2方法,光产生随机数只需要69ms。因此排除取模为性能瓶颈。

我们可以注意到,code3产生的数往往是小于65535的,而i是依次递减的。因此,对于code3而言,访问的内存总是在前65535个地址中,以及依次移动的cnt-i。而code2产生的随机数对cnt-i取模后,该数取值范围很大很大,因此总是造成cache miss,因此比code2慢3.5倍。

原文地址:https://www.cnblogs.com/fahaizhong/p/12240075.html

时间: 2024-08-02 09:07:26

Cache命中:性能优化实记之Cache命中对CPU运行性能的影响的相关文章

Linux性能优化从入门到实战:07 CPU篇:CPU性能优化方法

性能优化方法论 ??动手优化性能之前,需要明确以下三个问题: ??(1)如何评估性能优化的效果? 确定性能的量化指标.测试优化前的性能指标.测试优化后的性能指标. ??量化指标的选择.至少要从应用程序和系统资源这两个维度,分别选择不同的指标:1)应用程序的维度,我们可以用吞吐量和请求延迟来评估应用程序的性能.2)系统资源的维度,我们可以用 CPU 使用率来评估系统的 CPU 使用情况. ??行性能测试注意点:1)避免性能测试工具干扰应用程序的性能:2)避免外部环境的变化影响性能指标的评估. ??

ECshop网店系统百万级商品量性能优化-简单的一些Cache内存配置

ECshop网店系统对于产品的数据.模板.Query都可以缓存,也就是把一些商品详情页.分类页.Search页的数据经过一次访问后,用文件的形式保存下来,下次有人访问相同的页面时,不用再查数据库,直接读取Cache展示出来,减少服务器数据库压力. 这样的做法的确可以加速访问,减少资源浪费,对于流量比较大,或者页面重复访问Hit Rate比较高的很有用,但这个也只能解决一部分问题,对于一个有几十万商品的ECshop网店来说,最大的压力不是来自于自然访问的流量,而是勤劳的Google Bot或者Bi

android性能优化实战前篇

本文地址:http://blog.csdn.net/iamws/article/details/51629160 前言: 最近因为某项目cpu,内存的使用率实在让人不敢恭维:手机发烫,电量下降已经让用户无法忍受:频繁快速迭代发版导致各种性能问题突出:由于之前产品不考虑低端手机情况,低端手机直接跑到崩溃,直接体现的是DAU的急速下降:最终在竞品的对比数据下,开始重视这块事情了,也给了我们半个月时间去优化性能. 目标: 性能达到并且低于竞品的消耗值,并且能让低配用户也能玩起来. 这就是这篇文章的来源

Linux性能优化从入门到实战:04 CPU篇:CPU使用率

??CPU使用率是单位时间内CPU使用情况的统计,以百分比方式展示. $ top top - 11:46:45 up 7 days, 11:52, 1 user, load average: 0.00, 0.01, 0.00 Tasks: 198 total, 1 running, 197 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.2 us, 0.2 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st K

Linux性能优化从入门到实战:03 CPU篇:CPU上下文切换

??linux操作系统是将CPU轮流分配给任务,分时执行的.而每次执行任务时,CPU需要知道CPU寄存器(CPU内置的内存)和程序计数器PC(CPU正在执行指令和下一条指令的位置)值,这些值是CPU执行任务所依赖的环境,也就是CPU上下文. ??CPU上下文切换,就是把前一个任务的CPU上下文(CPU寄存器和程序计数器)保存起来,然后加载入新任务的上下文到CPU寄存器和程序计数器中,最后跳转到程序计数器所指的位置,运行新任务. ??保存下来的上下文会在系统内核中,并在任务重新调度执行时再次加载进

Android应用性能优化系列视图篇——SVG图片版本兼容及性能优化解决方案

SVG矢量图在图片表现力方面远远优于PNG位图,同时在可维护性和修改性方面也比位图要方便很多.尽管Android在5.0版本就引入了SVG图片的解决方案:Vector.然而,兼容性和性能方面却是差强人意,以至于至今都未能广泛使用. 本篇博客给大家带来一套较为不错的解决方案:SVG-Android(作者是本人...),相比于Vector,其在兼容性方面能够兼容到2.3以上,同时在性能方面,也有了质的提升. 开源库地址:https://github.com/MegatronKing/SVG-Andr

web性能优化之---JavaScript中的无阻塞加载性能优化方案

一.js阻塞特性 JS 有个很无语的阻塞特性,就是当浏览器在执行JS 代码时,不能同时做其他任何事情,无论其代码是内嵌的还是外部的. 即<script>每次出现都会让页面等待脚本的解析和执行(不论JS是内嵌的还是外链的),JS代码执行完成后,才继续渲染页面. 二.优化方案 1.尽管脚本的下载过程并不会相互影响,但页面仍然必须等待所有JS下载并执行完成才能继续.所以尽可能将所有<script>标签放置在页面底部,紧靠关闭标签</body>的上方.此方法可以保证页面在脚本运

Linux性能优化从入门到实战:06 CPU篇:快速定位CPU瓶颈

CPU性能指标 ?? ??(1)CPU使用率:1) 用户态CPU使用率(包括用户态 user 和低优先级用户态 nice).2) 系统CPU使用率.3) 等待 I/O 的CPU使用率.4) 软中断和硬中断的CPU使用率.5) 虚拟机占用的CPU使用率. ??(2)平均负载 Load Average:过去 1 分钟.过去 5 分钟和过去 15 分钟的平均负载 ??(3)进程上下文切换:1) 无法获取资源而导致的自愿上下文切换:2) 被系统强制调度导致的非自愿上下文切换. ??(4)CPU缓存命中率

Linux性能优化从入门到实战:02 CPU篇:平均负载

每次发现系统变慢时,我们通常做的第一件事,就是执行 top 或 uptime 命令: $ uptime 22:22:17 up 2 days, 20:14, 1 user, load average: 0.63, 0.83, 0.88 // 22:22:17 当前时间 up 2 days, 20:14 系统运行时间 1 user 正在登录用户数 // load average 过去 1 分钟.5 分钟.15 分钟的平均负载 ??平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数