目前和未来的缓存构建

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

不运行总是比运行更快

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

  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 即刻加速您的构建!
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/173094.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

汇编学习(1)

汇编、CPU架构、指令集、硬编码之间的关系 ● 汇编语言:这是一种低级语言,用于与硬件直接交互。它是由人类可读的机器码或指令组成的,这些指令告诉CPU如何执行特定的任务。每条汇编指令都有一个对应的机器码指令,CPU可以理解和执…

Ps:对象选择工具

对象选择工具 Object Selection Tool是 Photoshop 2020 版以后新增的选区工具,可用于自动选择图像中的对象或区域,如人物、汽车、宠物、天空、水、建筑物和山脉等。 快捷键:W 让对象选择工具自动检测并选择图像内的对象或区域,或者…

CTF-php特性绕过

注意&#xff1a;null0 正确 nullflase 错误 Extract变量覆盖 <?php$flagxxx; extract($_GET);if(isset($shiyan)){ $contenttrim(file_get_contents($flag));//trim移除引号if($shiyan$content){ echoctf{xxx}; }else{ echoOh.no;} }?> extract() 函数从数组中将…

真实感渲染的非正式调研与近期热门研究分享

真实感渲染的非正式调研与近期热门研究分享 1 期刊1 Top2 Venues 2 Rendering Reserach1 Material2 BRDF3 Appearance Modeling4 Capture5 Light Transport光线传播6 Differetiable Rendring-可微渲染7 Ray Tracing8 Denoising降噪9 NeRF 3 VR/AR4 Non-Photorealistic Renderin…

matlab simulink PMSM永磁电机DTC控制

1、内容简介 略 10-可以交流、咨询、答疑 2、内容说明 PMSM永磁电机DTC控制 PMSM、永磁电机、DTC控制 传 是 &#xff0c;它的工作原理是&#xff1a;首先设定好运行期望值和滞环的容差值&#xff0c;然后把电机 到的差值 号输出&#xff0c;可以 示需要减小 大输出…

10000字!图解机器学习特征工程

文章目录 引言特征工程1.特征类型1.1 结构化 vs 非结构化数据1.2 定量 vs 定性数据 2.数据清洗2.1 数据对齐2.2 缺失值处理 原文链接&#xff1a;https://www.showmeai.tech/article-detail/208 作者&#xff1a;showmeAI 引言 上图为大家熟悉的机器学习建模流程图&#xff0c;…

计算机中了locked勒索病毒怎么办,locked勒索病毒解密,数据恢复

当下网络技术飞速发展&#xff0c;但同样带来的网络安全威胁也不断增加&#xff0c;其中较为明显的威胁就是locked勒索病毒&#xff0c;自从今年以来&#xff0c;很多企业的计算机都遭受到了locked勒索病毒攻击&#xff0c;导致企业的计算机系统瘫痪。通过云天数据恢复工程师对…

【解决方案】ubuntu 解决办法 ImportError: cannot import name ‘_gi‘ from ‘gi‘

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

37回溯算法-理论基础

目录 什么是回溯算法 基本思想 问题场景 回溯算法的理解 回溯算法模板 LeetCode之路——257. 二叉树的所有路径 分析 什么是回溯算法 回溯算法是一种解决组合优化问题、搜索问题以及决策问题的算法。它通常用于尝试在一组可能的解决方案中搜索并找到满足特定条件的解。…

H5游戏源码分享-色块选择游戏

H5游戏源码分享-色块选择游戏 玩到后面色块越来越小&#xff0c;越来越难找出 <!DOCTYPE html><html><head><meta http-equiv"Content-Type" content"text/html; charsetUTF-8"><meta charset"UTF-8"><meta na…

【LeetCode每日一题合集】2023.10.23-2023.10.29(简单的一周)

文章目录 2678. 老人的数目&#xff08;简单遍历模拟&#xff09;1155. 掷骰子等于目标和的方法数&#xff08;动态规划&#xff09;2698. 求一个整数的惩罚数&#xff08;预处理dfs回溯&#xff09;2520. 统计能整除数字的位数&#xff08;简单模拟&#xff09;1465. 切割后面…

C++系列之list的模拟实现

&#x1f497; &#x1f497; 博客:小怡同学 &#x1f497; &#x1f497; 个人简介:编程小萌新 &#x1f497; &#x1f497; 如果博客对大家有用的话&#xff0c;请点赞关注再收藏 &#x1f31e; list的节点类 template struct list_Node { public: list_Node* _prev; list_…

67 内网安全-域横向smbwmi明文或hash传递

#知识点1: windows2012以上版本默认关闭wdigest&#xff0c;攻击者无法从内存中获取明文密码windows2012以下版本如安装KB2871997补丁&#xff0c;同样也会导致无法获取明文密码针对以上情况&#xff0c;我们提供了4种方式解决此类问题 1.利用哈希hash传递(pth&#xff0c;ptk等…

CCF CSP认证历年题目自练 Day39

题目 试题编号&#xff1a; 201312-5 试题名称&#xff1a; I’m stuck! 时间限制&#xff1a; 1.0s 内存限制&#xff1a; 256.0MB 问题描述&#xff1a; 问题描述   给定一个R行C列的地图&#xff0c;地图的每一个方格可能是’#’, ‘’, ‘-’, ‘|’, ‘.’, ‘S’, ‘…

C/C++跨平台构建工具CMake-----灵活添加库并实现开发和生产环境的分离

目录 1.概述2.创建项目3 配置运行项目3.1 编写开平方根示例代码3.2 编写CMake构建脚本 4.使用子模块实现求平方根的功能4.1 在子模块中实现两种求平方根的方法4.2 构建Mathfunctions子模块4.3 在根目录引用子模块的功能4.3.1 编写构建脚本4.3.2 编写C代码使用MathFunctions库中…

qt高精度定时器的使用停止线程应用

##线程停止 //线程停止应用 public: explicit WorkerThread(QObject *parent 0) :QThread(parent), m_bStopped(false){qDebug() << "Worker Thread : " << QThread::currentThreadId();}~WorkerThread(){stop();quit();wait();}void stop() {qDebug()…

队列(Queue)概念+通过单、双链表来模拟队列+环形队列+OJ面试题(用队列实现栈、用栈实现队列、设计环形队列)

文章目录 队列(Queue)一、 概念1.尾进头出 二、模拟队列1.单链表实现队列1.1 设置结点1.2 入队offer1.3出队 poll1.4 empty方法&#xff0c;peek方法&#xff0c;getUsedSize方法 2.双链表实现队列2.1 创建结点2.2 入队列2.3 出队列2.4 peek、size、isEmpty方法 三、环形队列1.…

小程序源文件的简单获取方法分享

小程序的源文件地址 在微信的服务器上。普通用户想要直接获取到在微信服务器去获取,肯定是十分困难的,有没有别的办法呢? 简单思考一下我们使用小程序的场景就会明白,当我们点开一个微信小程序的时候,其实是微信已经将它的从服务器上下载到了手机,然后再来运行的。所以我…

Android:窗口管理器WindowManager

Android&#xff1a;窗口管理器WindowManager 导言 本篇文章主要是对Android中与窗口(Window)有关的知识的介绍&#xff0c;主要涉及到的有&#xff1a; WindowWindowManagerWindowManagerService 主要是为了更进一步地向下地深入Android屏幕渲染的知识&#xff08;虽然窗口…

打破尺寸记录!荷兰QuTech研发16量子点阵列新技术

承载16个量子点交叉条阵列的量子芯片&#xff0c;可无缝集成到棋盘图案&#xff08;图片来源&#xff1a;网络&#xff09; 由荷兰代尔夫特理工大学(TU Delft)和荷兰应用科学研究组织(TNO)组建的荷兰量子计算研究中心QuTech的研究人员开发了一种用相对较少的控制线来控制大量量…