CCACHE 使用快速入门

ccache是什么

ccache – “compiler cache”的缩写,是一个gcc/g++的c语言编译器缓存。

ccache能做什么

简单来说,ccache将基于单条gcc编译命令级别颗粒,将本次编译命令的产物,复制并压缩一份到缓存目录中,下次编译的时候, 如果检测到相同编译命令,并且没有修改输入的源文件(当前c/cpp或依赖的头文件) ,则直接读取缓存目录中上次编译流程,省去编译时间,从而优化编译时长。

对项目工程而言,一次代码修改仅会改变极少量的源文件,使用ccache只会重新编译修改部分的代码相关的源文件,而未进行修改的源文件则可以直接使用缓存优化了编译时长。

ccache的效率如何

  • 小试牛刀
    使用ccache编译一个简单的cpp
    • 原始编译
      time g++ hello.cpp -o hello.o
      原始编译

    • 首次通过ccache 进行编译
      time ccache g++ hello.cpp -o hello.o
      在这里插入图片描述

    • 二次通过ccache 进行编译
      time ccache g++ hello.cpp -o hello.o
      在这里插入图片描述

编译方式编译时长
原始构建0.24s
使用ccache首次构建0.30s
使用ccache二次构建0.02s

使用ccache首次编译时长 > 原始编译时长 >> 使用ccache二次编译时长

原因是使用ccache会对编译命令做缓存处理需要花费一些耗时。
(详细原因放在之后再更新)

  • 实际工程表现
    以使用虚拟机1U2G规格编译redis-6.0.16:
    原始直接make:
    在这里插入图片描述

    make clean后使用ccache首次编译:
    首次编译

    make clean后使用ccache二次编译:
    二次编译

编译方式编译时长
原始构建35s
使用ccache首次构建43s
使用ccache二次构建2.8s

可以看到,对于重复编译,无论是单命令编译,还是实际工程编译,使用ccache构建速度都压缩了十倍,极大的提升了编译效率!

ccache 如何使用

安装ccache

  • apt直接安装

    # 安装ccache
    apt install ccache
    # 查看ccache版本
    ccache -V 
    
  • 源码安装
    目前ccache遵循GPL-3.0在github上开源,并且处于开源软件的成长期,迭代较快,apt源并不能实时同步最新版本,可通过源码编译安装的方式,获取最新版本。
    github: https://github.com/ccache/ccache

ccache的使用方式

  • ccache 拉起编译命令
    ccache g++ -c hello.cpp -o hello.o
  • ccache伪装成编译器
    # 找到ccache的安装路径
    which ccache 
    # 安装实际路径为: /usr/bin/ccache 
    # 创建软连接,将ccache伪装成g++编译器
    ln -s /usr/bin/ccache g++
    # 使用伪装后的g++ 进行编译
    ./g++ -c hello.cpp -o hello.o

可是问题来了

在实际工程当中,可能是由Makefile或者CMake进行管理编译,不可能手动修改所有的编译命令,我们应该如何将ccache使用上呢?

最为常用的方式是:
无论是在Makefile还是Cmake都可以通过声明环境变量的方式来使用ccache

# 在构建脚本中增加
export CC="ccache gcc"
export CXX="ccache g++"
# 再进行编译make/cmake 
make 
# cmake: 
cmake -B output && cmake --build output
  • make

对于Makefile工程,我们常会通过会在Makefile中,通过CC/CXX指定编译器,因此在编译前通过配置缓存变量CC/CXX来指定要是用编译器即可。
在这里插入图片描述

  • cmake
    Cmake隐式使用CC和CXX两个缓存变量,通过export 配置CC/CXX一样能使ccache生效。
    在这里插入图片描述

ccache使用情况

如上在使用ccache跑一个CMake工程的时候,我们如果不注意标准输出内容,就比较难判断本次编译是否使用了ccache。

有没有一种更好的方式来帮助我们判断当前工程是否使用ccache呢?

ccache提供了查询缓存命中能力
执行 ccache -s -v
在这里插入图片描述

可以详细的看到

  • 缓存存放目录
    Cache directory
  • 缓存配置文件路径
    Primary config
  • 最近一次使用缓存的时间
    Status updated
  • 缓存总体命中的情况
    • Hits表示命中缓存
    • Misses表示未命中缓存,但是生成了缓存,下次可以命中
  • 缓存目录使用大小
    Cache size

注意:

ccache 会通过LRU自动清理较长未访问的缓存文件,使得缓存总大小小于Cache size。不要手动清理Cache directory目录,造成缓存丢失。

如果默认缓存目录会影响到你的正常使用磁盘,可通过 在/etc/profile 增加ccache配置缓存目录的环境变量,改变缓存目录并使其一直生效。

# 将ccache的缓存目录设置为了/usr1/zhou/ccache
vim /etc/profile
# 追加环境变量
export CCACHE_DIR=/usr1/zhou/ccache 
# 让环境变量生效
source /etc/profile

小结

通过上述的介绍,如果你只是想简单了解并使用ccache,已经可以满足日常使用ccache帮助自己的工程更快的进行编译。

如果还想对ccache有更深的了解,在后续内容中会介绍ccache 其他好用的配置项功能以及ccache的源码实现。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
零基础快速入门教程,实实在在为初学者着想。 远离学院派式的教育,从工程师的角度解决工程师遇到的问题。 教程目标: 致力于解决Cadence 软件入门难的问题。 轻松学习,快速上手,最大限度降低Cadence 软件学习的时间成本。 教程特色: 实战为王,国内唯一一部以实际工程为主线的视频教程。 系统性强,从原理图到PCB 设计到出光绘全部流程。 各集任务明确,要点清晰,招招实用,超级详细。 从零开始,无需任何基础,直观易懂,手把手式的讲解。 一听就懂,一学就会,一用就灵。 Cadence SPB15.7 快速入门视频教程目录 第1讲 课程介绍,学习方法,了解CADENCE软件 第2讲 创建工程,创建元件库 第3讲 分裂元件的制作方法 1、homogeneous 和 heterogeneous 区别 2、创建homogeneous类型元件 3、创建heterogeneous类型元件 第4讲 正确使用heterogeneous类型的元件 1、可能出现的错误 2、出现错误的原因 3、正确的处理方法 第5讲 加入元件库,放置元件 1、如何在原理图中加入元件库 2、如何删除元件库 3、如何在元件库中搜索元件 4、放置元件 5、放置电源和地 第6讲 同一个页面内建立电气互连 1、放置wire,90度转角,任意转角 2、wire的连接方式 3、十字交叉wire加入连接点方法,删除连接点方法 4、放置net alias方法 5、没有任何电气连接管脚处理方法 6、建立电气连接的注意事项 第7讲 总线的使用方法 1、放置总线 2、放置任意转角的总线 3、总线命名规则 4、把信号连接到总线 5、重复放置与总线连接的信号线 6、总线使用中的注意事项 7、在不同页面之间建立电气连接 第8讲 browse命令的使用技巧 1、浏览所有parts,使用技巧 2、浏览所有nets,使用技巧 3、浏览所有offpage connector,使用技巧 4、浏览所有DRC makers,使用技巧 第9讲 搜索操作使用技巧 1、搜索特定part 2、搜索特定net 3、搜索特定power 4、搜索特定flat nets 第10讲 元件的替换与更新 1、replace cache用法 2、update cache用法 3、replace cache与pdate cache区别 第11讲 对原理图中对象的基本操作 1、对象的选择 2、对象的移动 3、对象的旋转 4、对象的镜像翻转 5、对象的拷贝、粘贴、删除 第12讲 1、修改元件的VALUE及索引编号方法 2、属性值位置调整 3、放置文本 4、文本的移动、旋转、拷贝、粘贴、删除 5、编辑文字的大小、字体、颜色 6、放置图形 第13讲 如何添加footprint属性 1、在原理图中修改单个元件封装信息 2、在元件库中修改封装信息,更新到原理图 3、批量修改元件封装信息 两种方法:(1) 直接针对元件修改,(2)在property editor中选择元件修改 4 检查元件封装信息是否遗漏的快速方法 第14讲 生成网表 1、生成netlist前的准备工作 2、生成netlist方法 第15讲 后处理 1、生成元件清单 2、打印原理图 第16讲 高速电路设计流程,本教程使用的简化流程 第17讲 Allegro常用软件模块介绍,各个软件模块之间的关系 第18讲 Allegro PCB Editor 软件操作界面介绍 第19讲 allegro中两个重要的概念:class和subclass是什么。 第20讲 1. Allegro零件库封装制作的流程步骤。 2. 规则形状的smd焊盘制作方法。 3. 表贴元件封装制作方法。 4. 0805贴片电容的封装制作实例。 第21讲 1. BGA272封装制作 TI DSP6713 2. 如何设置引脚名称,如何修改引脚布局 第22讲 如何创建自定义形状焊盘 第23讲 SOIC类型封装制作 第24讲 PQFP类型封装制作,学习引脚的旋转方法 第25讲 包含通孔类引脚的零件制作,零件制作向导的使用 第26讲 包含非电气引脚的零件制作方法 第27讲 如何创建创建电路板 第28讲 设置层迭结构,创建电源层地层平面 第29讲 导入网表,栅格点设置,DRAWING OPTION设置 第30讲 手工摆放零件 第31讲 使用原理图进行交互式摆放 第32讲 按原理图页面进行摆放 第33讲 使用Allegro PCB Editor按room进行摆放 第34讲 使用OrCAD Capture CIS按room进行摆放 第35讲 快速布局,摆放过程中如何自动定位找到零件 第36讲 PCB布局基本知识简单介绍 第37讲 约束规则设置对话框简介,各部分关系 第38讲 约束规则设置方法 第39讲 线宽线距规则设置示例 第40讲 区域约束规则设置 第41讲 1. 设置器件模型,加载模型库,赋予器件模型 2. Constraint manager objects显示设置 3. 创建总线 第42讲 设置拓扑约束(方法1) 第43讲 设置拓扑约束(方法2) 第44讲 线长约束设置 第45讲 相对延迟设置 第46讲 差分规则设置 第47讲 布线准备 1. 布线准备:设置颜色 2. 布线准备:特殊方式显示电源网络的飞线 3. 布线准备:网络的高亮设置 4. 布线准备:DRC标记显示方式 5. 布线准备:布线栅格点设置 6. 布线准备:飞线显示的开关 7. 布线准备:用不同的颜色同时高亮不同的网络 第48讲 BGA零件的自动扇出 第49讲 手工布线、控制面板中内容解释 第50讲 走线 1. 走线:拉线 2. 走线:加过孔,换层 3. 走线:控制线宽 4. 走线:推挤、抱紧 5. 走线:抓焊盘 6. 走线:替换走线 7. 走线:自动完成 8. 走线:控制出线方向 第51讲 群组布线 第52讲 布线时信息显示 1. 布线时显示延迟以及相对延迟信息 2. 动态显示走线长度 第53讲 差分布线方法 1. 伴随走线 2. 单根走线模式 3. 添加过孔 4. 自动分离与靠拢 第54讲 两种高速布线形式 1. 含T形连接点的网络走线方法 2. 蛇形走线方法 3. 修线 第55讲 铺铜操作 1. 内电层铺铜 2. 外层铺铜 3. 编辑shape的边界 4. 指定网络 5. 手工void 6. 删除孤岛 7. 铺静态铜皮 8. 铜皮的合并 第56讲 电源层分割 第57讲 后处理:重新编号,back annotate,查看报告,数据库检查等杂散操作。 第58讲 丝印处理 第59讲 NC DRILL 相关操作 第60讲 制作光绘文件的方法步骤
JetCache 是一个基于 Java 的开源缓存库,它提供了对方法级缓存的支持。使用 JetCache 可以方便地将方法的结果缓存起来,提高应用程序的性能和响应速度。 下面是使用 JetCache 的基本步骤: 1. 添加 JetCache 依赖:将 JetCache 的依赖项添加到项目的构建文件中(如 Maven 或 Gradle)。 2. 配置缓存:在应用程序的配置文件中,配置需要使用的缓存类型和相关属性。例如,可以配置内存缓存、Redis 缓存等。 3. 注解方法:在需要进行缓存的方法上添加 JetCache 的注解,如 `@Cached`、`@CacheRemove` 等。这些注解可以指定缓存的 key、过期时间、条件等。 4. 使用缓存:在调用被注解的方法时,JetCache 会根据注解的配置自动处理缓存。如果缓存中存在所需数据,则直接返回缓存数据;否则,执行方法并将结果放入缓存。 下面是一个简单的示例: ```java import io.github.jiashunx.cache.Cache; import io.github.jiashunx.cache.annotation.Cached; public class MyService { private Cache<String, String> cache; // 构造函数或依赖注入注入 Cache 实例 @Cached(name = "myCache", key = "#param", expire = 600) public String getData(String param) { // 从数据库或其他数据源中获取数据 // ... return data; } } ``` 在上述示例中,`MyService` 使用了 JetCache 的 `@Cached` 注解对 `getData` 方法进行了缓存配置。缓存的名称为 "myCache",缓存的 key 使用方法参数 `param`,缓存的过期时间为 600 秒。当调用 `getData` 方法时,JetCache 会自动处理缓存逻辑,如果缓存中存在对应的数据,则直接返回缓存数据;否则,执行方法并将结果放入缓存。 这只是 JetCache 的基本用法,JetCache 还提供了其他更复杂的缓存策略和配置选项,可以根据具体需求进行配置和使用。 希望这个回答对您有帮助!如有更多问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值