商业化大前端在性能优化领域的探索与实践
导读:在业务飞速发展的过程中,用户体验是必不可少的一个环节,而页面性能是直接影响用户体验的重要因素。当页面加载时间过长、交互操作不流畅时,意味着业务可能会出现转化率降低、用户流失等业务问题。在过去一年,为了确保用户在使用快手商业化产品时能获得流畅、快捷和满意的体验,快手商业化大前端团队立项「商业化端架构性能治理专项」,针对12个核心项目累计30+核心页面进行性能优化治理。
一、背景介绍
1.1页面性能优化的价值与意义
在业务迅猛发展的时代,用户体验已成为企业成功的关键因素之一,而页面性能则是塑造用户体验的核心要素。早在十多年前,亚马逊就已经意识到页面加载速度对商业成果的深远影响:亚马逊支付页面每增加100毫秒的延迟,可能减少1%有效转化。页面加载时间的延长和交互操作的不流畅性,不仅会损害用户体验,还可能导致转化率下降和用户流失等后果。
在快手商业化团队,我们深知页面性能对提升用户体验的重要性。因此,我们基于快手内部动态化技术的特点,并参考了Google的性能标准,制定了快手商业化页面性能达标的北极星指标(如下)
1.2 核心页面性能现状
在实际的商业化业务场景中,尽管端侧页面繁多,但流量却高度集中于少数核心系统与页面之上。因此,从ROI的角度出发,
我们采取了页面分级治理策略,将优化资源聚焦于核心页面。我们界定核心页面依据两大关键要素:一是它们直接面向外部用户,位于广告投放的核心路径之中;二是依据页面访问量(PV数)的统计结果。
遵循这些原则,我们挑选出了12个流量较大且处于广告投放核心路径的快手商业化核心系统,涵盖了广告投放、广告落地页等核心业务流程,并进一步从中筛选出超过30+核心页面作为优化的重点对象。那么,这些承载着巨大流量的核心页面,其性能表现究竟如何呢?
我们借助雷达平台(快手内部的性能监控平台),对各核心页面的性能数据进行了全面且细致的整理与分析,包括静态资源、接口等维度,并得出以下结论:
- 仅有18.42%的页面即7个页面达到了“性能优秀”的基线标准,且其中有4个页面只是略优于基线标准。有15个页面其性能被判定为“较差”。
- 在C端系统中,主要性能瓶颈在于静态资源加载耗时过长,约47.36%页面静态资源耗时超过1500ms,约65.78%页面的静态资源耗时超过1000ms。这意味着用户在访问这些页面时,需要等待较长时间来加载页面内容,这无疑会严重影响用户体验。
- 而在B端系统中,主要性能瓶颈在于接口耗时过长,约31.57%页面的接口请求耗时超过2500ms,约21.05%页面的请求接口耗时占比超过60%。这对于B端系统的操作效率构成了严峻挑战,也直接影响了广告投放等核心业务流程的顺畅进行。
1.3 核心性能问题分析
基于上述性能现状的深入分析,我们明确了当前面临的核心性能问题主要归为两大类:一是静态资源加载和渲染耗时过长,二是接口请求耗时较长。针对这两大类核心性能问题,我们需要进一步细化问题原因,制定针对性的优化策略,并付诸实施。
1.3.1 静态资源加载和渲染耗时过长
为了进一步下钻分析「静态资源」相关的性能问题,我们通过破晓平台(快手内部的性能诊断平台)对上述各核心页面进行性能评测,发现这些核心项目普遍存在较多显而易见的问题。我们对这些问题进行了归类,主要有以下4个方面:
- HTTP/2覆盖率较低:所有项目均存在使用HTTP/1.1的情况,作为对比,HTTP/2能显著提高页面加载性能、减少延迟、提高带宽利用效率等;
- 图片资源优化空间大:绝大部分项目直接引用原始图片的CDN链接,没有对图片做任何处理;
- 页面渲染结构较复杂:以广告投放平台为首的核心业务的页面首屏渲染结构非常复杂;
- 脚本资源较大:脚本资源请求体积较大,JS覆盖率较低,脚本解析时长占高,影响资源加载时长和渲染时长
1.3.2 接口请求耗时较长
众所周知,B端系统往往逻辑非常复杂,尤其是像商业化的广告投放平台这样逻辑复杂且规模庞大的系统,涉及的接口数量众多,管理起来极具挑战性。为此我们对核心页面加载链路上的相关接口进行了细致的梳理和分析。在梳理过程中,我们重点关注了4个B端系统中的14个核心页面,这些页面是用户访问频率高、业务逻辑复杂的关键区域。通过监测和分析,我们发现这些页面中累计存在30个接口性能表现不佳。
二、面临的挑战
在深入了解快手商业化内部性能现状及问题的基础上,我们意识到在推进性能治理的过程中,仍需克服以下三方面的挑战:
挑战一:统一推进各核心系统治理的难度较高
性能优化治理是一项复杂且长期的工作,尤其是在页面较多、项目发展阶段不一、技术栈差异化的情况下。商业化端侧性能治理专项涉及12个项目30+页面,涉及页面流量大,且项目间发展阶段不同,导致性能问题的根源也各不相同,统一推进治理的难度较高,若任由业务方自行优化则重复劳动较多,同时难以形成可复制、可推广的最佳实践。为了解决这一问题,我们需要建立一套性能治理机制,既要针对性地解决端侧性能问题,也要在项目推进中引入性能优化卡口,防止性能问题后期劣化。
挑战二:B端业务核心链路体验度量模型缺失
快手商业化的B端业务主要集中在广告投放、企业服务、内容变现、电商合作等领域,主要服务于广告主、代理商、品牌等,帮助他们在平台上实现品牌曝光、用户转化和销售增长。B端业务交互逻辑重,用户停留时间长,操作次数多,除了关注页面加载阶段的性能以外,还需要关注业务核心链路的操作体验。目前,快手商业化缺乏B端体验度量模型,难以评估广告投放系统的用户体验。因此,我们亟需建立B端业务核心链路体验度量模型,以评估用户使用商业化B端核心系统的流畅度,并基于数据洞察问题,不断改进B端核心系统的用户体验。
挑战三:C端业务Web和Native结合不够深入
在现代的互联网应用中,Web端和Native端的界限日益模糊。用户的使用场景不再局限于某一特定平台,而Web与Native端的紧密结合可以有效提升产品开发效率、用户体验和资源共享度。由于早期业务开发周期紧急、动态化技术栈熟悉度不足等原因,商业化端内项目采用Web技术栈的比例较高,与Native侧结合不够深入。这导致了一些页面未能充分利用端上优化手段,如离线包、预建连、预请求等。为了应对多变的业务环境和技术挑战,我们需要借助「大前端」的组织优势,打破技术壁垒,搭建统一、高效且灵活的大前端技术体系。
三、治理思路与落地实践
基于上述的背景现状分析,我们进一步制定了治理思路,核心能力包括以下三个方面:
- 性能评估模型和防劣化机制:建立系统化的性能评估模型,评估性能健康度,发掘并解决端侧在性能维度的潜在问题,提升用户体验;同时,建立性能防劣化机制,使性能问题能够有效的收敛在产品上线发布前
- B端核心链路体验度量模型:建立以「操作卡顿率」和「任务达成率」为核心指标的B端链路体验度量模型,从而评估用户使用商业化B端系统的流畅度,并基于数据洞察问题,不断改进商业化B端系统的平台体验
- C端Web和Native紧密结合:搭建端内页面的技术选型标准,推动端内项目接入已有的端上能力&进行动态化改造,同时,持续探索Web&Native紧密结合的可能性,进一步输出体系化的方案,从而提升端内动态化页面的流量占比
下面我们进一步拆解上述三大核心建设方向下的关键技术实现方案:
3.1 性能评估模型和防劣化机制
为了系统化地提升和维护页面性能,我们构建了一套「事前-事中-事后」的性能评估模型和防劣化机制。
(1)事前-数据置信
问题:在快手内部,性能上报依赖主动打点,难以保证数据准确性,易发生数据打点时机和用户体感差距较大的可能性;
解法:落地数据置信方案计算FMP误差率(Web页面对比浏览器内核计算的LCP,动态化页面对比动态化内核计算的FMP),对于差值 > 20%的页面进行上报点位校准
(2)事中-推进治理
问题:性能优化治理涉及页面较多,且项目间发展阶段不同,影响性能背后的问题差异较大,统一推进治理难度较高,但如果放任业务方各自优化则重复工作较多,探索最佳实践的难度较大;
解法:利用破晓平台(快手内部的性能评测平台)对页面进行性能评测,得出当前核心页面存在的核心问题;以评测结果为指引,针对性地梳理出8项核心优化策略和治理最佳实践,并推进各核心页面治理;
(3)事后-防劣化
问题:随着项目持续迭代,存在性能持续劣化的可能性,难以毕其功于一役;
解法:基于「事中-推进治理」的各项策略,定义明确可度量的准出规则,推进在治理完成后加入性能卡口,防止性能劣化;
3.1.1 事前-数据置信
快手内部目前性能上报依赖主动打点,这种方式虽有较好的灵活性,但一线开发同学较难感知上报时机是否准确,且随着业务的迭代,难以保证上报逻辑是否会被更改。因此,需要针对FMP/T3上报点位进行数据置信。
如上图所示,FMP/T3数据置信过程主要包括三个核心步骤:
首先,根据页面类型选择基准值,Web页面采用Google提出的LCP作为基准,而动态化页面则使用动态化内核自动计算的FMP作为基准;
其次,通过录屏方式记录页面加载过程中的关键性能指标,并截取关键帧以便一线开发团队了解上报FMP时的页面状态;
最后,结合关键帧图片识别对比基准值与上报点的误差比例来计算FMP误差率,对于误差率超过20%的页面,会提出检查上报时机的建议。这一20%的阈值是基于快手内部2023年对核心前端项目的校验结果得出。
如上图所示是当前FMP置信能力的效果图,FMP置信能力的实现仅是起点,更重要的是产品化能力的落地。如下方的时序图所示,我们在破晓平台(快手内部的性能评测平台)实现FMP置信的产品化能力:
- 依托openAPI与雷达平台(快手内部的性能监控平台)无缝对接,预获取项目信息、高流量页面URL等,同时开放业务方手动录入;
- 为确保登录便捷,实现自动登录服务,兼容快手内网SSO、快手Web及App等多种登录方式;
- 通过定时巡检机制,每日收集页面性能数据,定期向部门、项目组或单项业务进行推送数据,提升各角色对重点项目置信现状的洞察力。
3.1.2 事中-推进治理
如下图所示,我们以破晓平台的评测结果为指引,针对性地梳理出8项核心优化策略和治理最佳实践。在此,我们选取在静态资源、网络请求等维度下具有代表性的治理策略展开讲述。
(1)静态资源优化:图片资源、脚本打包优化等
图片资源优化:
图片资源的优化成为提升网站性能的关键一环,我们采用兼容性较好的WebP格式。与传统的JPG和PNG格式相比,WebP通常能提供更小的文件体积,从而加快网页加载速度并节省带宽。同时,快手的CDN服务支持自动将PNG、JPG等格式的图片资源转换为WebP格式。以下面的图片为例,将PNG图片转换为WebP可以减少80+%的体积:
同时,我们还针对性地提供了一个功能全面的图片处理库,支持以下特性:
- 支持JPG、PNG、WebP、GIF等多种图片格式的转换,具备图片裁剪、缩放、模糊、背景色设置等功能
- 能处理域名收敛问题,支持特定CDN域名和全局CDN域名的传入
- 能根据端内网络环境智能加载不同质量的图片,并根据设备像素比自动调整图片裁剪尺寸,确保图片资源的高效利用和优质显示
尽管WebP已经表现出色,但随着技术的不断进步,更高效的图片格式如HEIF和AVIF相继出现。HEIF使用HEVC的帧内编码技术,具有HEVC帧内编码工具集,达到了更高的压缩率、更好的画质。AVIF则是基于AV1视频编解码器的图片格式,在高压缩比和较高的视觉质量方面比WebP和HEIF更优。然而,这些新格式在兼容性方面仍存在挑战,尤其是与老旧设备和浏览器的兼容性问题,限制了它们的广泛应用。目前,快手APP已经支持HEIF格式,端内的图片库也增加了相关参数以支持这一格式。此外,快手还自主研发了KVIF格式,比AVIF和HEIF更优。
脚本资源打包优化:
快手商业化前端针对前期各自独立的研发工具和方案带来的维护成本高、低效协作等问题,在23年进行了前端工程方案的整合升级,统一将数百个前端工程迁移至Kmi(快手商业化的前端工程化解决方案)。从工程角度来看,统一迁移Kmi不仅提升开发效率和降低维护成本,同时还保证了灵活性和可扩展性,为性能优化提供了便利的先发优势。Kmi提供了三种Code Splitting策略,以适应不同的项目需求:
- bigVendors:将async chunk 里的node_modules的文件打包到一起,避免重复,但容易导致单文件尺寸过大,无缓存效率可言;
- depPerChunk:和bigVendors类似,将依赖按package name + version 进行拆分,解决bigVendors的尺寸和缓存效率问题,但请求较多;
- granularChunks:在bigVendors和depPerChunk之间取了中间值,同时又能在缓存效率上有更好的利用。
在默认使用granularChunks策略的基础上,Kmi针对各核心项目定制化打包优化,以最大化提升商业化前端应用的性能和用户体验。此外,Kmi在每次构建后自动生成详细报告,帮助团队深入了解每次构建过程中的关键差异,为代码质量和构建速度的持续优化提供数据支持,也为排查问题提供了快速还原现场的能力。
(2)网络请求优化:HTTP/2+域名收敛、数据预请求等
升级HTTP/2+域名收敛
为了提升性能,我们针对仍在使用HTTP/1.1的商业核心项目域名(包括业务域名、CDN域名、埋点域名等)进行了HTTP/2升级。HTTP/2的多路复用特性允许在同一TCP连接上并行交换多重请求-响应消息,从而克服了HTTP/1.1中同一域名下请求数量受限的问题。
在升级HTTP/2的同时,我们还建议业务收敛域名,将资源集中到更少的域名下,以减少TCP连接数和优化DNS查询。此外,我们针对端内场景配置了预建连,提前建立与目标域名的TCP连接和TLS握手,进一步减少延迟,提升首次请求的响应速度。
数据预请求
如下图所示,常规页面流程可简化为「HTML/Bundle加载解析 -> 页面资源加载解析 ->数据API请求 -> 页面渲染」4个过程,数据预请求的核心思路是最大限度提前页面数据加载时机,提前获取当前或未来需要的数据,以便用户在访问时能够更快地体验到完整的内容。
我们的数据预请求方案结合KMI实现了发起预请求、消费预请求、日志上报和缓存机制等主要功能。通过工程配置,用户可以在解析时立即发起预请求并缓存结果,随后通过插件暴露的适配器对预请求结果进行消费。同时,我们在关键节点上报自定义事件,收集预请求API信息以完善日志能力。缓存机制避免重复请求同一数据,进一步加速了页面加载速度。
在推进接入过程中,为了适配各接入方的使用场景,我们在请求时机、底层请求库兼容、日志能力完善、业务定制化需求的问题中不断优化进行了40+次的迭代,功能不断提升。目前该方案在B端各核心项目中发挥了较大的作用,单项目FMP平均减少600ms+。上述方案主要针对web项目,端内项目则主要是使用客户端在端内提供的预请求方案,可见下方的【结合客户端能力】这一章节。
3.1.3 事后-防劣化
如上面的时序图所示,主要结合天穹平台(快手内部的前端代码审查平台)实现性能维度的天穹平台插件,在前端研发流程上建立性能防劣化机制,具备性能维度下的任务打标、流程阻断、豁免审批、结果触达等性能卡口能力。目前已为快手商业化端侧核心项目加入卡口,一期选取5项web指标、7项动态化指标作为卡口规则,规则详见下表:
3.2 B端核心链路体验度量模型
为了更好地监控B端系统的用户操作体验和流程完成情况,我们建设以【操作卡顿率】和【任务达成率】为核心指标的B端核心链路体验度量模型。其中操作卡顿率关注核心路径的操作响应体验,任务达成率则关注核心任务流程的完成情况。
3.2.1 操作卡顿率:核心路径的操作响应体验
操作卡顿率是衡量用户操作体验的核心指标,它反映了用户在执行操作时等待时间超出预设阈值的占比情况。该指标通过对比卡顿操作数与有效操作数来计算得出,直观展现了用户在不同使用场景下可能遭遇的延迟问题。其中,有效操作数记录了用户每次成功执行的操作,而卡顿操作数则统计因等待时间超出阈值而引发的卡顿事件。
在操作卡顿率的核心思路中,我们为核心链路上的主要操作设定了明确的响应阈值,一旦超出此阈值,即视为一次卡顿。针对B端用户多样化的操作场景,我们进一步细化了操作场景,并制定了相应的细分指标和阈值,以确保评估的准确性和针对性。
基于这些通用规则,我们为不同B端核心业务平台在不同场景下的操作卡顿设定了合理的阈值,并设计通用的卡顿率数据上报SDK,以便业务轻松接入各自平台,降低接入成本。在快手商业化前端团队的B端体验度量模型中,操作卡顿率占据举足轻重的地位:
- 卡顿率能够客观、准确地反映用户体验的流畅度,不会跟产品形态强耦合,也不会因业务需求的迭代而产生大幅波动;
- 作为一个全局性的性能指标,卡顿率与前端和后端的优化工作紧密相连,后端接口的优化和前端页面的提升都能直接反映在卡顿率的改善上,这充分体现了技术优化的价值,并帮助团队清晰评估技术优化的成果,最终助力提升用户的交互体验。
3.2.2 任务达成率:核心任务流程的完成情况
任务达成率是衡量用户成功完成任务或达成目标的比例,其计算基于提交成功数(经过访问ID去重处理)与页面开始加载数的比值。这一指标深受前端静态资源可用性、后端接口服务稳定性以及用户个体差异等多重因素的影响。
以商业化广告投放平台的创编流程(即创建广告的过程)为例,用户在进行广告创建时,会经历一系列有序的步骤。具体包括:
- 页面到达成功率:衡量从用户开始访问页面到主JS执行完毕,再到页面加载完成的整个过程的成功率
- 提交转化率:关注用户在填写完广告属性后点击提交按钮的转化率
- 提交成功率:记录提交操作成功的情况,并通过访问ID进行细致区分,以确保统计的准确性
为了分析任务达成率的异常现象,我们还会收集一系列技术指标进行监控。当任务达成率的细分指标出现异常波动时,这些技术指标将作为关键的诊断工具,帮助我们定位问题的根源。具体的技术归因指标包括但不限于:
3.3 C端Web和Native紧密结合
在移动端互联网时代无论是H5还是动态化页面,与客户端的紧密结合是性能优化的关键路径。这主要包括两个核心方面:一是充分利用和结合已有的客户端能力,以提升页面加载速度;二是实施端侧页面的动态化改造,利用动态化的优势进一步提升性能表现。
3.3.1 结合已有的客户端能力
针对H5页面,常见的优化手段包括预加载、预建连、离线包、code cache等,而对于KRN页面,则采用包预置、业务包预加载、code cache、预请求等策略。
这些优化手段可能有着不同的名称,但其核心理念相通的。在快手内部,Yoda和KDS两个端侧基础团队提供了性能优化SOP。基于这些SOP,我们梳理出一系列适合商业化的优化手段,并推动了核心端内页面的接入工作。实践证明,这些端侧的优化方案取得了显著的效果。在接入后,端内单项目的FMP时间平均减少500ms+。
3.3.2 端侧页面动态化改造
对于web技术栈而言,由于浏览器底层架构设计、JS的解析和执行效率等原因,在渲染性能和交互流畅度上很难突破浏览器限制。相较而言,采用类RN技术栈开发的页面由于核心渲染层 & 组件基于原生实现,整体性能体验能够提升一个台阶,且付出的开发效率/发版效率代价相对而言较小。
举个例子,快手商业化大前端团队以磁力建站落地页作为试点,完成动态化改造后的性能收益提升35%以上,性能提升也带来了显著的业务CVR和预期消耗增长。因此,如下图所示,我们搭建了一套端内页面的技术选型标准,完善动态化技术基建,持续推动端内项目完成动态化改造。
值得一提的是,在探索Web和Native紧密结合过程中,我们也在思考一套渐进式增强方案。以商业化磁力金牛和粉条为例,这两个项目主要流量在端内,且有很强的B端属性,历史包袱较重。经过与业务同学共同评估,贸然地切换至动态化技术栈的成本较高。因此,我们希望能在保留原有Web开发模式的同时,进一步提供性能极佳的富交互组件来创建Hybrid应用,让这些Web应用具有媲美Native的用户体验。
如上图所示,以磁力金牛和粉条的多Tab场景为例,我们的思路是基于Native实现多Tab容器,用于承载复杂的多Tab页面结构。主要能力如下:
- 容器能力:提供RN、TK、webview等渲染容器,并提供定制化的容器能力,如资源预加载、数据预请求、容器预热等方案
- 配置化能力:支持自定义底部导航栏、底部Tab、骨架屏等配置化能力
- 框架交互能力:支持容器间数据共享&通信,可切换tab,控制元素展现等
四、阶段性成果
经过一系列的努力与优化,我们取得了显著的阶段性成果:
- B端业务:B端核心页面整体性能提升45.74%,核心广告投放平台的卡顿率指标均降低至20%以下
- C端业务:C端核心页面整体性能提升42.12%,C端核心页面的触达率提升10.16pp,C端核心页面的秒开率提升31.62pp
- 北极星达标情况:性能优秀达标率提升61.63%,性能良好达标率提升41.95%,这充分表明我们的性能优化策略正在逐步显现成效。
- B/C端FMP月均值整体呈逐月下降趋势,核心页面的整体性能(P90分位)提升43.23%
综上所述,无论是从北极星指标的提升,还是从B/C端FMP月均值的下降,再到B端卡顿率和C端触达率&秒开率等指标的提升,都充分证明了我们的努力是值得的。
五、总结与展望
本篇文章主要基于大前端视角,解决不同领域场景下的页面性能问题。展望未来,我们将继续把性能体验作为重点关注领域,打造标准化、平台化的性能优化领域体系建设,推动商业化大前端页面性能水平达到业界领先,以确保商业化用户在使用我们的产品时获得流畅、快捷和满意的体验,从而推动业务的持续增长和发展。
本文作者:袁肇豪
相关文章:
商业化大前端在性能优化领域的探索与实践
导读:在业务飞速发展的过程中,用户体验是必不可少的一个环节,而页面性能是直接影响用户体验的重要因素。当页面加载时间过长、交互操作不流畅时,意味着业务可能会出现转化率降低、用户流失等业务问题。在过去一年,为了…...
FinClip | 2024年11月产品大事记
FinClip 的使命是使您(业务专家和开发人员)能够通过小程序解决关键业务流程挑战,并完成数字化转型的相关操作。不妨让我们看看在11月的产品与市场发布亮点,看看是否有助于您实现目标。 产品方面的相关动向👇…...
EasyPlayer.js在同一个http的mp4视频流地址,浏览器可以播放,播放器中却播放不了
流媒体技术正站在数字化时代的前沿,随着互联网技术的不断进步和市场需求的日益增长,其发展前景显得尤为广阔。随着全球数字化转型的不断深入,流媒体行业将迎来更加繁荣的未来,成为信息传播和娱乐消费的主要渠道。 用户遇到在同一个…...
探索云原生安全解决方案的未来
我们是否充分意识到云端所面临的网络安全威胁? 在当今互联互通的世界中,维护安全的环境至关重要。云的出现扩大了潜在威胁的范围,因为它催生了机器身份(称为非人类身份 (NHI))及其秘密。随着组织越来越多地转向云原生…...
发愿和许愿的区别是什么?
在许多宗教和文化中,发愿和许愿都是人们表达内心愿望、祈求神灵保佑的重要方式。尽管这两个词在日常生活中经常被交替使用,但它们在含义和实践上存在一些重要的区别。本文就来详细说说发愿和许愿的区别,并提供相关的背景信息和建议。 1. 定义…...
【IntelliJ IDEA 集成工具】TalkX - AI编程助手
前言 在数字化时代,技术的迅猛发展给软件开发者带来了更多的挑战和机遇。为了提高技术开发群体在繁多项目中的编码效率和质量,他们需要一个强大而专业的工具来辅助开发过程,而正是为了满足这一需求,TalkX 应运而生。 一、概述 1…...
【故障处理--修改CI流水线】
背景:研发同事反映CI流水线卡顿严重,判断是移动云镜像仓库的带宽太小,故在公有云搭建一个harbor仓库,这就意味着CI流水线有些配置需要改动 1、CI流水线的介绍 helm-chart/pcas-appstore-hy存放的是chart包需要的文件 Dockerfile…...
Android 使用 Gson + OkHttp 实现 API 的常规使用(个人心得)
学习笔记 一、依赖和权限的添加 网络权限: 在 Android 中进行网络请求时,必须声明权限,确保应用具有访问互联网的能力。 <uses-permission android:name="android.permission.INTERNET"/> 依赖项: 确保在 build.gradle 中添加以下依赖: dependencies …...
MR30分布式 IO 模块:硅晶行业电池片导片机的智能 “心脏”
硅晶产业作为全球能源和电子领域的基石,其生产规模庞大且工艺复杂。从硅料的提纯、拉晶,到硅片的切割、电池片的制造,每一个环节都要求高精度与高稳定性。在电池片生产环节,导片机承担着硅片传输与定位的重要任务,其运…...
mysql高级篇 | 尚硅谷 | 第2章_数据库和文件系统的关系
二、数据库和文件系统的关系 文章目录 二、数据库和文件系统的关系1、查看默认数据库2、 数据库在文件系统中的表示3、表在文件系统中的表示①InnoDB存储引擎模式②表中数据和索引②MyISAM存储引擎模式 4、小结 1、查看默认数据库 查看一下在我的计算机上当前有哪些数据库&…...
React 生命周期
React 生命周期可以分为三个主要阶段:挂载(Mounting)、更新(Updating)和卸载(Unmounting) 挂载(Mounting) 当组件实例被创建并插入到 DOM 中时,会依次调用以…...
OpenCV--图像查找
OpenCV--图像查找 代码和笔记 代码和笔记 import cv2 import numpy as np""" 图像查找--特征匹配的应用,通过特征匹配和单应性矩阵 单应性变换:描述物体在世界坐标系(原图)和像素坐标系(对比图&#x…...
数据保护策略:如何保障重要信息的安全
一、什么是数据安全? 数据安全是保护数字信息免遭盗窃、未经授权的访问和恶意修改的过程。这是一个持续的过程,负责监督信息的收集、存储和传输。 机密性:保护数据免遭未授权方访问。 完整性:保护数据免遭未经授权的修改、损坏…...
AI生成图表化:深入探索Mermaid
引言 在使用生成式AI时,只要你提出让AI帮你生成mermaid图,AI的生成就会出现丰富的图形! 在现代文档编写中,图表的使用不仅能增强文档的可读性,还能更直观地表达复杂的概念和流程。Mermaid 作为一款开源的图表绘制工具…...
模型训练中梯度累积步数(gradient_accumulation_steps)的作用
模型训练中梯度累积步数(gradient_accumulation_steps)的作用 flyfish 在使用训练大模型时,TrainingArguments有一个参数梯度累积步数(gradient_accumulation_steps) from transformers import TrainingArguments梯…...
jenkins安装(jdk1.8已安装)
1. 下载对应jenkins版本 https://mirrors.jenkins.io/war/ 2. 上传至服务器目录并启动 mkdir -p /root/jenkins cd /root/jenkins 上传文件 启动:nohup java -jar jenkins.war --httpPort9090 &> jenkins.log & 访问:http://ip:9090 选…...
爬虫实战:获取1688接口数据全攻略
引言 在电商领域,数据的重要性不言而喻。1688作为中国领先的B2B电商平台,提供了海量的商品数据。通过爬虫技术获取这些数据,可以帮助企业进行市场分析、价格监控和供应链管理。本文将详细介绍如何使用Python爬虫技术合法合规地获取1688接口数…...
基于Mybatis,MybatisPlus实现数据库查询分页功能
基于Mybatis,MybatisPlus实现数据库查询分页功能 目录 基于Mybatis,MybatisPlus实现数据库查询分页功能使用Mybatis插件实现分页数据库准备分页插件配置和使用常用数据: 使用MybatisPlus插件实现分页数据库准备分页插件配置和使用自定义分页查…...
【C++】求第二大的数详细解析
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯题目描述💯输入描述💯解题思路分析1. 题目核心要求2. 代码实现与解析3. 核心逻辑逐步解析定义并初始化变量遍历并处理输入数据更新最大值与次大值输…...
Ubuntu18安装后基本配置操作
1. 关掉自动更新 不关掉自动更新,会将你的ubuntu系统更新到更高版本,一些配置就不能用了,所以要关掉自动更新。在“软件和更新”中将“自动检查更新”设置为从不。 2. ubuntu换国内源 参考链接换源 按照这个换源这个换源好使 ,…...
【Azure 架构师学习笔记】- Azure Function (1) --环境搭建和背景介绍
本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Function 】系列。 前言 随着无服务计算的兴起和大数据环境中的数据集成需求, 需要使用某些轻量级的服务,来实现一些简单操作。因此Azure Function就成了微软云上的一个必不可少的组成部分。 …...
【ubuntu】将Chroma配置为LINUX服务
Chroma是一个轻量级向量数据库。既然是数据库,那么我希望它是能够长时间运行。最直接的方式是配置为service服务。 可惜官方没有去提供配置为服务的办法,而鄙人对docker又不是特别感冒。所以自己研究了下chroma配置为服务的方式。 系统:ubu…...
Linux24.04 安装企业微信
今天工作需要把windows系统换成了linux,但是公司的沟通工具是企业微信。去企业微信官网看了,没有linux版本,只能想办法解决了,不然再换回去就太坑了。 方案 1、使用docker容器,2、使用deepin-wine 本人对docker不太熟…...
路由引入问题(双点双向路由回馈问题)
简介 总所周知,路由引入import又称路由重分发redistribute,为了解决不同路由协议进程间路由信息不互通而使用的技术,由于不同路由协议的算法、机制、开销等因素的差异,它们之间无法直接交换路由信息。因此,路由引入技…...
Redis 实现分布式锁
单实例条件下的分布式锁 -- 加锁操作 -- KEYS[1]: 锁的键(lock_key) -- ARGV[1]: 当前客户端的标识(client_id) -- ARGV[2]: 锁的过期时间(毫秒)if (redis.call(EXISTS, KEYS[1]) 0) then-- 如果锁不存在…...
Redis客户端(Jedis、RedisTemplate、Redisson)
1. 简介 Redis作为一个当下很火热的非关系型数据库,Java从业人员基本都离不开对Redis的使用。在Java程序中该数据库,需要借助于市面上的开源客户端,如Jedis、Spring Data Redis、Redisson,它们可以作为操作Redis非关系型数据库的桥…...
虚幻引擎内各个组件的关系
1. GameMode: 关系: GameMode 是游戏规则的制定者和管理者,GameState 则是游戏状态的记录者和同步者。GameMode 通常负责创建和初始化 GameState。 交互: GameMode 可以直接访问和修改 GameState 的属性,例如更新游戏分数、切换游戏阶段等。GameState 的变化会通过 GameMode …...
Python Flask Web框架快速入门
Flask 入门Demo Flask 开发环境搭建,执行如下指令: pip install flask# 第一节: Flask 快速入门from flask import Flask app Flask(__name__)app.route(/flask) def hello_flask():return Hello Flaskapp.run()核心代码剖析: 从flask包导…...
【java学习笔记】Set接口实现类-LinkedHashSet
一、LinkedHashSet的全面说明 (就是把数组不同位置的链表当成一个节点然后相连)...
阿里云ACP云计算模拟试题(附答案解析)
1、将基础设施作为服务的云计算服务类型是_____服务。 A.laas B.Paas C.SaaS D.Daas 答案:A 解析:基础设施即服务有时缩写为 IaaS,包含云 IT 的基本构建块,通常提供对联网功能、计算机(虚拟或专用硬件&#x…...
java 缓存篇2
缓存的部署方式 单机主从哨兵集群 特性主从(Master-Slave)哨兵(Sentinel)集群(Cluster)数据分片不支持不支持支持,基于 slot 进行水平分片高可用性部分支持(手动故障转移ÿ…...
12.11-12.12总结(约瑟夫问题 机器翻译 滑动窗口)
12.11 刷题 《算法竞赛》这本书看了很多了,但是题目没咋做,所以今天来刷一下题 P1996约瑟夫问题 还依稀记得大一的时候被约瑟夫支配的恐惧(哭),但是现在做就感觉很简单(虽然也敲了一会,今早感…...
Elasticsearch+Kibana+IK分词器+拼音分词器安装
目录 ES报错 Kibanaik分词器拼音分词器 安装都比较简单,可以参考这几篇博客 ES 如何在 Linux,MacOS 及 Windows 上进行安装 Elasticsearch 报错 ES启动报错error downloading geoip database [GeoLite2-ASN.mmdb] Kibana KIBANA的安装教程ÿ…...
2020 年“泰迪杯”数据分析职业技能大赛A 题教育平台的线上课程智能推荐策略
2020 年“泰迪杯”数据分析职业技能大赛A 题教育平台的线上课程智能推荐策略 完整代码请私聊 博主 一、 背景 近年来,随着互联网与通信技术的高速发展,学习资源的建设与共享呈现出新的发展趋势,各种网课、慕课、直播课等层出不穷,…...
运维面试题
1 deployment和statefulset区别 Kubernetes (k8s) 中的 Deployment 和 StatefulSet 是两种不同类型的控制器,用于管理应用的生命周期,但它们适用于不同的应用场景。以下是它们在存储、调度顺序和网络分配方面的区别: 存储 Deployment: 适用…...
计算机网络之网络层超详细讲解
个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 计算机网络之网络层超详细讲解 收录于专栏【计算机网络】 本专栏旨在分享学习计算机网络的一点学习笔记,欢迎大家在评论区交流讨论💌 …...
Windows桌面系统管理2:VMware Workstation使用和管理
Windows桌面系统管理0:总目录-CSDN博客 Windows桌面系统管理1:计算机硬件组成及组装-CSDN博客 Windows桌面系统管理2:VMware Workstation使用和管理 Windows桌面系统管理3:Windows 10操作系统部署与使用-CSDN博客 Windows桌面系统管理4:Windows 10操作系统运维管理-…...
深入理解 CSS 文本换行: overflow-wrap 和 word-break
前言 正常情况下,在固定宽度的盒子中的中文会自动换行。但是,当遇到非常长的英文单词或者很长的 URL 时,文本可能就不会自动换行,而会溢出所在容器。幸运的是,CSS 为我们提供了一些和文本换行相关的属性;今…...
【Linux】Ubuntu:安装系统后配置
hostname:更改主机名 打开终端。 使用hostnamectl命令更改主机名。 sudo hostnamectl set-hostname 新的主机名你可以使用hostnamectl 命令来验证更改是否成功: hostnamectlChrome:更换默认浏览器 以下是从 Ubuntu 中移除预装的 Snap 版 Fi…...
我们来学mysql -- MSI安装(安装篇)
主题 书接上文,在《探讨win安装方式》中官方推荐MSI要是把大厂的标准奉为圭臬,说啥认啥,他一翻脸,小丑不就是咱了再说了,都干到家门口了8.4版本官方文档,还不给他梭罗下 MSI 点击**.msi弹出MySQL Install…...
MySQL其一,概念学习,可视化软件安装以及增删改查语句
目录 MySQL 1、数据库的概念 2、数据库分类 3、MySQL的安装 4、安装过程中的问题 DataGrip的使用: SQLynx的使用: 5、编写SQL语句 6、DDL语句 7、DML 新增数据: 删除数据: 修改数据: MySQL SQL其实是一门…...
SpringCloud 题库
这篇文章是关于 SpringCloud 面试题的汇总,包括微服务的概念、SpringCloud 的组成及相关技术,如服务注册与发现、负载均衡、容错等,还涉及 Nacos 配置中心、服务注册表结构等原理,以及微服务架构中的日志采集、服务网关、相关概念…...
【ETCD】[源码阅读]深度解析 EtcdServer 的 processInternalRaftRequestOnce 方法
在分布式系统中,etcd 的一致性与高效性得益于其强大的 Raft 协议模块。而 processInternalRaftRequestOnce 是 etcd 服务器处理内部 Raft 请求的核心方法之一。本文将从源码角度解析这个方法的逻辑流程,帮助读者更好地理解 etcd 的内部实现。 方法源码 …...
数据分析与机器学习全解析
一、数据分析基础要点 (一)数据收集 确定数据源:明确是内部数据库、外部公开数据、传感器采集还是用户调研等来源,不同来源数据质量与获取难度各异。例如内部销售数据可直接获取,而市场调研数据需设计问卷并投入人力收…...
Qt 一个简单的QChart 绘图
Qt 一个简单的QChart 绘图 先上程序运行结果图: “sample9_1QChart.h” 文件代码如下: #pragma once#include <QtWidgets/QMainWindow> #include "ui_sample9_1QChart.h"#include <QtCharts> //必须这么设置 QT_CHARTS_USE_NAME…...
力扣——322. 零钱兑换
给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。 你可以认为每种硬币的数量是无限的。 示…...
Qt之网络监测
在Qt中,网络监测通常涉及到检测网络连接状态、网络延迟、带宽使用情况等。Qt提供了一些类和模块来帮助开发者实现这些功能。以下是一些常用的方法和类: 1. 检测网络连接状态 QtNetwork模块中的QNetworkConfigurationManager类可以用来检测设备的网络连…...
抓包软件fiddler和wireshark使用手册
fiddler官方文档 Fiddler 抓包教程1 Fiddler 抓包教程2 wireshark抓包学习 2添加链接描述 ip 过滤 ip.src_host ip.dst_host ip.addr mac 过滤 eth.src eth.dst eth.addr 端口过滤 tcp.port tcp.srcport tcp.dstport 协议类型过滤 arp dhcp 规则组合 and or...
【从零开始入门unity游戏开发之——C#篇03】变量和常量
文章目录 一、变量1、什么是变量?2、申明变量的固定写法3、变量的类型值和引用类型的区别无符号和有符号位——表示变量所占用的内存空间的大小范围——表示变量的取值范围取值范围和存储单位的关系为什么byte的范围是 0 到 255?为什么 sbyte 的范围是 -…...
SpringBoot 手动实现动态切换数据源 DynamicSource (上)
大家好,我是此林。 在实际开发中,经常可能遇到在一个SpringBoot Web应用中需要访问多个数据源的情况。 下面来介绍一下多数据源的使用场景、底层原理和手动实现。 一、 多数据源经典使用场景 场景一:业务复杂,数据量过大 1. 业务…...