当前位置: 首页 > news >正文

目前和未来的缓存构建

说起来可能有点反直觉,有时候不运行反而可以帮助我们加快速度,这正是网络浏览器运行的指导原则。不必在页面上加载所有内容,缓存的元素已经存在,不需要每次访问网站或网页时都重新加载。页面加载速度越快,浏览器的工作量就越少,最终结果也是一样的。

不运行总是比运行更快

对于软件开发中的缓存,这一指导原则同样适用。在此情况下,缓存可以带来四点好处:

  1. 明显加速开发;
  2. 降低成本,利用云资源进行计算时尤为明显,包括在完成本地构建时也适用,甚至可以扩展到 CI 服务器许可证,因为每个 CI 服务器可以并行完成更多的构建;
  3. 鼓励开发人员采用所需构建时间较长而经常避免的最佳实践,例如使用特性分支和频繁设置分支,每次引入小提交,频繁从仓库中提取变更等;
  4. 从 CI 的角度来看,构建时间越短,每次提交时构建就会左移(即:缩短时间),对开发人员的响应时间就越快,因此可以从容地应对紧要时刻(执行的构建越多,缓存“热度”就越高(即:缓存使用次数就越多),效率就越高),漏洞解决的时间就越快,上市时间就越快等等。

目前缺少哪些软件构建缓存方法?

缓存可以分为多个等级,不同等级对性能的影响也不同。缓存粒度越细(例如,缓存整个代码库、缓存几行代码、缓存整个脚本的对比),性能就越好,降低的成本也就越多。

因此,在构思如何缓存构建工件时,能够缓存和复用最终工件(如可执行文件和库)固然不错,但您也应该考虑到更细粒度级。缓存还应包括中间工件,C++ 对象文件、调试信息以及构建的其他方面,如单元测试输出和自定义构建命令等。

依赖关系的负担

缓存的一大驱动原理是:为了在编译期间成功复用缓存工件,当前任务必须具备与先前缓存的输出工件明确相关的输入依赖项。

为此,在任务中若要将工件存入缓存,该任务必须关联可以触发该缓存工件创建的所有输入依赖项。一般情况下,创建一个唯一的哈希 ID 来代表所有任务依赖项,包括输入文件、环境变量、命令行参数和其他输入等,就可以实现关联。该哈希 ID 将代表可以触发特定工件的所有依赖项。

只有当所有相关的输入依赖项都与原先执行任务对应的哈希值相同时,执行的任务才能复用先前缓存的工件。

目前常用的方法为了满足此要求,又给用户和我们想要缓存的工具/编译器带来了负担:

  • 用户负担,为了实现缓存,一些构建工具要求用户在其构建脚本中显式包括构建将要执行的每个任务的所有输入依赖项,这样做需要(用户完成)大量的工作,决定并显式编写整个产品依赖关系。此外采用这种方法,需要深入了解产品的结构和依赖关系,同时要求由引入新代码的开发人员强制维护这些依赖关系。虽然这种方法在新建产品时可能较为可行,但对于大型项目来说,要完成整个流程的难度非常大,还可能导致构建错误,特别是在持续需要强制执行显式声明的开发过程中。
  • 工具负担,一些工具内置了提供输入依赖关系的运行时服务,例如编译器的预处理功能。具有预处理能力的编译器允许用户确定编译任务的输入依赖关系。但问题是,这种方法需要逐个编译器实现。并非所有工具都具有预处理能力(例如:缓存单元测试),而且,在每个编译的任务上,仅仅是执行用于确定任务依赖关系的预处理进程,就会给构建机器带来计算负担,导致机器延长构建时间。在不同主机之间共享缓存时,例如一组开发人员共享缓存工件或一组持续集成节点,这些限制因素会变得更加复杂。

Incredibuild 的专利缓存方法

Incredibuild 的独特缓存构建法主要基于自身平台强大且经过实践验证的并行分发技术,注入进程的底层系统钩子(类似于反病毒软件的工作原理)。利用该技术,Incredibuild 可以自动映射读取到的每个文件或进程访问的其他输入,使其可供无缝使用和共享,以确定任务依赖关系,减轻用户负担和工具负担。

其工作原理如下:

  • 执行一个 Process(示例采用 C++ 编译进程);
  • Incredibuild 将系统钩子注入进程,使其能够监测编译进程正在使用的所有输入(文件夹、注册表标志、环境变量等);
  • 编译进程运行时,Incredibuild 会自动确定该进程所需的所有输入以及该进程创建的所有内容(输出);
  • 所有输入经过哈希处理,在输入及其生成的输出之间建立关联。然后将哈希值和输出都存入高速缓存中,哈希值则用作相应任务输出的索引 ID;
  • 缓存在网络上的多个用户之间共享之后,其作用会显著放大,用户可以复用在网络中任何地方创建的输出,而不必再次重建。

这种利用系统钩子无缝跟踪进程依赖关系进行缓存的方法是一种全新的缓存方法(美国专利局认定此方法在技术上具有创新性,可以申请专利)。

在 Visual Studio 中使用的案例

让我们以 Visual Studio C++ 为例,来分析演示 Incredibuild 的工作原理,缓存将分为“方案级”、“项目级”和“单元(文件)级”。也就是说,如果项目没有任何变化,那么整个项目工件都可以复用,无需重新构建其任何单元(在大型 C++ 应用中,一个解决方案中通常包含多个项目,涵盖数百个单元)。如果拥有更细粒度的单元级缓存(在 C++ 中,指的是缓存单个编译单元的 “obj” 文件),那么即使最终工件的依赖关系因单个单元的变化而发生了变化,我们也只需要重新执行已经变化的单元,同时从缓存中找到该单元的其余输出(就是实现复用)。这样加快了构建时间的同时,还减少了算力。

未来愿景

这种独特的通用“隐藏式”缓存方法释放了额外的功能,以探索开发生态系统的未来。这一领域高度分散,许多工具被用作大型构建执行的一部分,包括各种编译器、构建系统、软件语言工具、测试框架等。Incredibuild 的通用缓存方法未来可以作为统一的整体缓存解决方案,兼容构建中使用的所有工具,让这些工具也能充分利用缓存服务,同时还能帮助我们的客户加速:

  • 其他软件语言和编译器;
  • 其他计算用例,如各种测试框架、代码分析等;
  • 在编译速度更快的语言(如 C#)时,减少构建工作量;
  • 支持按顺序处理非并行工作;
  • CI 进程中还包括用户自定义步骤,如自定义构建步骤、构建脚本、自制工具等。

整体缓存解决方案适用于多种不同的用例,这意味着围绕缓存服务开发的所有特性都可以服务于所有缓存用例。这种方法已经有许多用例,证明了我们大力投入构想这一强大的整体缓存方案是合理的。

点击此处,了解更多关于 Incredibuild 构建缓冲的信息,并可以获取免费试用 License 即刻加速您的构建!
在这里插入图片描述

相关文章:

目前和未来的缓存构建

说起来可能有点反直觉,有时候不运行反而可以帮助我们加快速度,这正是网络浏览器运行的指导原则。不必在页面上加载所有内容,缓存的元素已经存在,不需要每次访问网站或网页时都重新加载。页面加载速度越快,浏览器的工作…...

aws亚马逊云免费账号代充值!!!什么是 AWS Lambda?

AWS Lambda 是一项计算服务,可使您无需预配置或管理服务器即可运行代码。 Lambda 在可用性高的计算基础设施上运行您的代码,执行计算资源的所有管理工作,其中包括服务器和操作系统维护、容量调配和弹性伸缩和记录。使用 Lambda,您…...

《从零开始大模型开发与微调 :基于PyTorch与ChatGLM》简介

内 容 简 介 大模型是深度学习自然语言处理皇冠上的一颗明珠,也是当前AI和NLP研究与产业中最重要的方向之一。本书使用PyTorch 2.0作为学习大模型的基本框架,以ChatGLM为例详细讲解大模型的基本理论、算法、程序实现、应用实战以及微调技术,…...

【LeetCode】102. 二叉树的层序遍历

题目链接 文章目录 Python3方法一: 广度优先搜索 (BFS) ⟮ O ( n ) ⟯ \lgroup O(n) \rgroup ⟮O(n)⟯方法二: 深度优先搜索 (DFS) ⟮ O ( n ) ⟯ \lgroup O(n) \rgroup ⟮O(n)⟯ C方法一: 广度优先搜索 (BFS) ⟮ O ( n ) ⟯ \lgroup O(n…...

golang连接池检查连接失败时如何重试

在Go中,可以通过使用database/sql包的DB类型的Ping方法来检查数据库连接的可用性。如果连接检查失败,可以选择进行重试。以下是一个简单的示例代码,演示了如何在连接检查失败时进行重试: import ("database/sql""…...

从JavaScript到Rust的三年时间小结

Rust 是一种注重安全性、速度和并发性的系统编程语言。它能编译成高效的本地代码,无需垃圾回收即可访问内存等底层资源,同时还能防止分隔故障。 作者讨论了他们几年来用 Rust 构建大型应用程序和库的经验。他们发现 Rust 的借用检查器和类型系统有助于减…...

【Python机器学习】零基础掌握VotingRegressor集成学习

如何更准确地预测房价? 想象一下,你是一名房地产分析师,你的任务是预测一个小区的未来房价。这看似简单,但实际上,房价受到多种因素的影响,如地理位置、房屋面积、周围设施等。你可能会使用线性回归模型来进行预测,但是你会发现,尽管模型的准确性还可以,但还是存在一…...

云计算模式的区域LIS系统源码,基于ASP.NET+JQuery、EasyUI+MVC技术架构开发

云计算模式的区域LIS系统源码 云LIS系统源码,自主版权 LIS系统是专为医院检验科的仪器设备能与计算机连接。可通过LIS系统向仪器发送指令,让仪器自动操作和接收仪器数据。并快速的将检验仪器中的数据导入到医生工作站中进行管理,且可将检验结…...

面向对象设计原则之接口隔离原则

目录 定义接口隔离原则与单一职责原则示例 定义 接口隔离原则,全称为 Interface Segregation Principle,缩写ISP。 原始定义:Clients should not be forced to depend upon interfaces that they don’t use。 翻译: 不应该强行…...

haproxy 负载均衡

haproxy负载均衡 haproxy:基于C语言开发的开源软件 支持高性能的tcp和http负载均衡器,工作中用的版本1.5.9 haproxy功能:主要用于高并发的web站点,工作原理和nginx、lvs都一样 haproxy缺点: 单节点部署,单实例运行。代…...

在el-dialog中使用tinymce 点击工具栏下拉框被遮挡

在el-dialog中使用tinymce控件时,会出现点击工具栏下拉框出现在弹窗下一层,审查元素之后发现是tinymce的下拉框z-index优先级低于el-dialog的z-index导致的,所以需要增加tinymce的下拉框的z-index值。 通过审查元素得到,需要修改t…...

CloudQuery + StarRocks:打造高效、安全的数据库管控新模式

随着技术的迅速发展,各种多元化的数据库产品应运而生,它们不仅类型众多,而且形式各异,国产化数据库千余套,开源数据库百余套 OceanBase 、PolarDB 、StarRocks…还有一些像 Oracle、MySQL 这些传统数据库。这些数据库产…...

各类统计模型R语言的详细使用教程-R语言的线性回归使用教程

各类统计模型R语言的详细使用教程-R语言的线性回归使用教程 前言R语言的线性回归代码示例回归诊断误差项正态qq图内学生化残差外学生化残差线性关系异常值的发现、处理帽子矩阵的方法DFFITS 准则Cook统计量COVRATIO准则多重共线性summaryKlein判别法特征根法条件指数法方差膨胀…...

点云从入门到精通技术详解100篇-基于尺度统一的三维激光点云与高清影像配准

目录 前言 研究现状 三维激光点云与影像配准研究现状 点云配准研究现状...

<蓝桥杯软件赛>零基础备赛20周--第2周

报名明年4月蓝桥杯软件赛的同学们,如果你是大一零基础,目前懵懂中,不知该怎么办,可以看看本博客系列:备赛20周合集 20周的完整安排请点击:20周计划 每周发1个博客,共20周(读者可以按…...

CMake多文件构建初步

前面学习了cmake,不熟悉,只是记录了操作过程;下面再继续; 略有一点进步,增加一个代码文件,之前是1个代码文件; 如下图,prj是空文件夹, CMakeLists.txt如下;…...

游戏研发的解决方案有哪些?

游戏研发的解决方案可以根据不同的需求和情境而有所不同,以下是一些常见的游戏研发解决方案: 游戏引擎: 游戏引擎是游戏研发的基础,它提供了开发游戏所需的核心功能,如图形渲染、物理引擎、音效管理、动画等。一些流行…...

Bayes决策:身高与体重特征进行性别分类

代码与文件请从这里下载:Auorui/Pattern-recognition-programming: 模式识别编程 (github.com) 简述 分别依照身高、体重数据作为特征,在正态分布假设下利用最大似然法估计分布密度参数,建立最小错误率Bayes分类器,写出得到的决…...

【考研数学】数学“背诵”手册 | 需要记忆且容易遗忘的知识点

文章目录 引言一、高数常见泰勒展开 n n n 阶导数公式多元微分函数连续、可微、连续可偏导之间的关系多元函数极值无条件极值条件极值 三角函数的积分性质华里士公式( “点火”公式 )特殊性质 原函数与被积函数的奇偶性结论球坐标变换公式 二、写在最后 …...

HJ3 明明的随机数

牛客网:HJ3 明明的随机数 https://www.nowcoder.com/practice/3245215fffb84b7b81285493eae92ff0?tpId37&tqId21226&ru/exam/oj 使用Go语言解题,最简单的方式: 解题一: // 运行时间:5ms 占用内存&#xff1a…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...

MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用

文章目录 一、背景知识&#xff1a;什么是 B-Tree 和 BTree&#xff1f; B-Tree&#xff08;平衡多路查找树&#xff09; BTree&#xff08;B-Tree 的变种&#xff09; 二、结构对比&#xff1a;一张图看懂 三、为什么 MySQL InnoDB 选择 BTree&#xff1f; 1. 范围查询更快 2…...