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

【iOS】UITableView性能优化

UITableView性能优化

  • 前言
  • 优化从何入手
    • 优化的本质
  • CPU层级优化
    • 1. Cell的复用
    • 2. 尽量少定义Cell,善于使用hidden控制显示视图
    • 3. 提前计算并缓存高度
      • `UITableView`的代理方法执行顺序
      • Cell高度
      • 缓存高度数组
    • 4. 异步绘制
    • 5. 滑动时按需加载
    • 6. 使用异步加载图片,减少主线程的消耗
    • 7. 使用轻量化对象
  • GPU层面
    • 控制尺寸
    • 减少图层混合操作
    • 避免离屏渲染
      • 下面的情况或操作会引发离屏渲染
      • 优化建议

前言

笔者近期刚刚结束第二个项目,了解学习学长博客以及自己搜索资料,发现UITableView有很多可以进行优化的部分,本篇博客对其性能优化进行一个总结,主要从CPU以及GPU两个方面出发,去解决性能优化的问题,以提高用户使用的流畅度。

  • CPU:对象的创建和销毁、对象属性的调整、布局计算、文本的计算和排版、图片的格式转换和解码、图像的绘制。
  • GPU:接收提交的纹理和顶点描述、应用变换、混合并渲染、输出到屏幕。

优化从何入手

  • 提前计算并缓存好高度(布局),因为tableView:heightForRowAtIndexPath:是调用最频繁的方法;
  • 滑动时按需加载,防止卡顿。这个在大量图片展示,网络加载的时候很管用,配合SDWebImage
  • 异步绘制,遇到复杂界面,遇到性能瓶颈时,可能就是突破口;
  • 缓存一切可以缓存的,这个在开发的时候,往往是性能优化最多的方向。

需要关注的点

  • cell的复用
  • cell高度的计算
  • 渲染(混合问题)
  • 减少视图数量(重写drawRect:
  • 减少多余的绘制操作
  • 不要给cell动态添加subView:
  • 异步化UI,不要阻塞主线程
  • 滑动时按需加载对应的内容。

优化的本质

UITableView的优化本质在于提高滚动性能和减少内存使用,以保证流畅的用户体验,从计算机层面来讲,其核心本质为降低CPUGPU的工作来提升性能

CPU层级优化

1. Cell的复用

UITableView中最核心的就是UITableViewCell的复用机制。简单来说,即UITableView只会创建比一屏幕多一点的cell,其余的都是从复用池中取出来重用的。当显示某一个位置的时候,都是先从复用池中取,如果存在就直接拿来显示,如果不存在,才重新创建。

在了解了cell的复用原理后,我们看看 UItableView的回调方法,最主要的两个回调方法是:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

有时候我们会认为是先调用第一个height再调用cellForRowAtIndexpath方法的,但实际上是先调用cellForRowAtIndexpath再调用height方法的。笔者另一篇博客详细讲解了相关内容:【iOS】自定义cell及其复用机制

2. 尽量少定义Cell,善于使用hidden控制显示视图

分析cell结构,尽可能将相同内容的抽取到一种样式Cell中,虽然可能Cell的体积会大一点,但是Cell的数量并不会很多,完全还是可以接受的。

  • 基于复用机制,运行时铺满屏幕的Cell数量大致是固定的,设为N,所以cell的实例为(N+c)个;但是如果有M个Cell的话,cell的实例就最多可能为M*(N+c)个了,虽然可能并不会多占用多少内容,但是少一点还是会好一点。
  • 减少代码量,减少 Nib 文件的数量,在一个 Nib 文件定义 Cell,容易修改、维护

尽量少在 cellForRowAtIndexPath:方法中使用[cell addSubView:]动态添加View,多使用hidden属性来控制view的隐藏和展示。同样,也不要在该方法中读取文件/写入文件

3. 提前计算并缓存高度

UITableView的代理方法执行顺序

如果我们设定了预估行高estimatedRowHeight,我们的Tableview会每一次先调用cellForRow又调一次对应的heightForRow方法。

如果我们并没有设定estimatedRowHeight,则会先遍历一次每个cell的tableView:heightForRowAtIndexPath:获取总的高度值 ,然后每调用一次cellForRow的时候再调用一次对应的heightForRow

但因为iOS11中的tableView的estimatedRowHeight默认值由原来的0变为UITableViewAutomaticDimension(打印出来为-1),因此我们可以大致认为我们每一次先调用cellForRow后会再调一次对应的heightForRow方法。

也就是说我们的Tableview一定是先调用cellForRow方法,然后再调用heightForRow方法。

Cell高度

在我们使用UITableView的时候,其询问Cell高度有两种不同的方式:

  1. rowHeight
    这种方式是针对所有Cell都具有固定高度的情况,设置的时候是:self.tableView.rowHeight = 100;来进行设置,不去实现tableView:heightForRowAtIndexPath:方法,减少了不必要的开销和计算,当我们遇到定高的cell的时候,我们可以使用这种方法,我们需要注意的是Cell的默认高度为44
  2. 使用tableView:heightForRowAtIndexPath:方法:
    通过使用协议中的这个方法,会使我们设置的rowHeight变得无效,这点我们需要注意,但同时,我们可以更便捷的设置多个不同Cell的高度。

estimatedRowHeight:
这个属性首次出现在iOS7.0,在官方文档中,描述为:

If the table contains variable height rows, it might be expensive to calculate all their heights when the table loads. Using estimation allows you to defer some of the cost of geometry calculation from load time to scrolling time.

与上面设定Cell的高度相同,设置估算行高也有两种方式,还有一种即为使用函数: - (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath。但是当我们面对不同的Cell的时候,还是可以只使用 estimatedRowHeight来设置。例如:当我们设置的时候,一个Cell的高度为40,另一种Cell的高度为80,我们就可以设置成60,尽量减少计算来使得第一次加载的时候更加流畅。

缓存高度数组

这里我们可以创建一个数组来存储已经计算好的cell高度,当他第一次显示的时候判断计算高度,并存入数组中,后面直接取出来使用即可。

4. 异步绘制

即异步操作在画布上绘制内容,将复杂的绘制过程放在后台线程中执行,而后在主线程显示:
在这里插入图片描述
笔者的GCD学习并不到位,后期笔者重新学习GCD后再回来补充这里的问题。

5. 滑动时按需加载

当我们自定义Cell的时候,多数情况下我们需要网络申请获取图片,虽然使用SDWebImage会异步加载图片,但是当我们开启线程过多的时候,也会卡顿,尤其是当网络不好的时候,所以我们需要利用UIScrollViewDelegate中的两个代理方法 scrollViewDidScroll: scrollViewDidEndDecelerating: 方法来判断滚动状态。在 scrollViewDidScroll: 中暂停加载图片,这样可以很好的解决这个问题。

我们还需要注意的一个问题是,当我们的Cell超出目标范围后,我们应该清除掉他们:当用户滑动表格或集合视图时,只为屏幕范围内可见的单元格(cell)加载内容。一旦这些单元格滚动出屏幕变得不可见,与它们关联的资源(如图像数据)应该被清除或释放,以避免不必要的内存占用。尽量减少内容的消耗。

6. 使用异步加载图片,减少主线程的消耗

对于使用异步加载图片,我们可以直接使用SDWebImage这个第三方库来加载图片。
这里笔者还没有了解该库后再进行了解。

7. 使用轻量化对象

我们一般来说设置画面的时候都使用的是UIView,但是其实有些地方不需要事件处理的时候我们可以使用CALayer,相比来说,CALayer更加接近底层一点。在UIView中其实也有CALayer属性,直接使用CALayer可以减少UIView层级的额外计算(当没有事件响应的时候)

GPU层面

控制尺寸

GPU能处理的最大纹理尺寸为4096*4096,超过这个尺寸就会占用CPU资源进行处理,所以纹理尽量不要超过这个尺寸。

纹理是一种在 GPU(图形处理单元)中用于表示图像或其他数据的二维数组。它可以被看作是一种特殊的图像数据结构,主要用于在渲染过程中为物体表面添加细节和颜色信息。这里笔者页不是很清楚,后期学会了再进行补充。

减少图层混合操作

当多个视图叠加,放在上面的视图是半透明的,那么这个时候GPU就要进行混合,把透明的颜色加上放在下面的视图的颜色混合之后得出一个颜色显示在屏幕上,这一步是消耗GPU资源。

UIViewbackgroundColor不要设置为clearColor,最好设置和superViewbackgroundColor颜色一样。
图片避免使用带alpha通道的图片

避免离屏渲染

GPU主要负责渲染与绘制图形,因此在这个层面我们着重讲一下iOS中的离屏渲染对UITableView性能产生的影响

下面的情况或操作会引发离屏渲染

  • 光栅化,layer.shouldRasterize = YES
  • 遮罩,layer.mask
  • 圆角,同时设置 layer.masksToBounds = YESlayer.cornerRadius > 0
  • 阴影,layer.shadow
  • layer.allowsGroupOpacity = YES 和 layer.opacity != 1
  • 重写drawRect方法

优化建议

  • 使用中间透明图片蒙上去达到圆角效果
  • 使用ShadowPath指定layer阴影效果路径
  • 使用异步进行layer渲染
  • 将UITableViewCell及其子视图的opaque属性设为YES,减少 - 复杂图层合成
  • 尽量使用不包含透明alpha通道的图片资源
  • 尽量设置layer的大小值为整形值
  • 背景色的alpha值应该为1,例如不要使用clearColor
  • 直接让美工把图片切成圆角进行显示,这是效率最高的一种方案
  • 很多情况下用户上传图片进行显示,可以让服务端处理圆角

相关文章:

【iOS】UITableView性能优化

UITableView性能优化 前言优化从何入手优化的本质 CPU层级优化1. Cell的复用2. 尽量少定义Cell,善于使用hidden控制显示视图3. 提前计算并缓存高度UITableView的代理方法执行顺序Cell高度缓存高度数组 4. 异步绘制5. 滑动时按需加载6. 使用异步加载图片,…...

通过检索增强生成(RAG)和重排序提升大语言模型(LLM)的准确性

探索大语言模型(LLM)结合有效信息检索机制的优势。实现重排序方法,并将其整合到您自己的LLM流程中。 想象一下,一个大语言模型(LLM)不仅能提供相关答案,还能根据您的具体需求进行精细筛选、优先…...

IDEA202403常用快捷键【持续更新】

文章目录 一、全局搜索二、美化格式三、替换四、Git提交五、代码移动六、调试运行 在使用IDEA进行程序开发,快捷键会让这个过程更加酸爽,下面记录各种快捷键的功能。 一、全局搜索 快捷键功能说明Shift Shift全局搜索Ctrl N搜索Java类 二、美化格式 …...

硬件元件三极管:从基础到进阶的电子探秘

一、基础理论 1. PN结(二极管) PN 结是采用不同的掺杂工艺,将 P 型半导体与 N 型半导体紧密接触而形成的一个界面区域。也就是我们常说的二极管。(P型带正电、N型带负电,电流由P流向N) 形成过程&#xff1…...

4. k8s核心概念 pod deployment service

以下是 Kubernetes 的核心概念详解,涵盖 Pod、Service、Deployment 和 Node,以及它们之间的关系和实际应用场景: 1. Pod 定义与作用 • 最小部署单元:Pod 是 Kubernetes 中可创建和管理的最小计算单元,包含一个或多个…...

12.第二阶段x64游戏实战-远程调试

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 上一个内容:11.第二阶段x64游戏实战-框架代码细节优化 本次写的内容是关于调试、排错相关的…...

自然语言处理的进化:BERT模型深度剖析

自然语言处理(NLP)领域近年来取得了跨越式的发展,尤其是随着深度学习技术的应用,不少新兴模型应运而生。其中,BERT(Bidirectional Encoder Representations from Transformers)作为一种革命性的…...

鸿蒙学习笔记(5)-HTTP请求数据

一、Http请求数据 http模块是鸿蒙内置的一个模块,提供了网络请求的能力。不需要再写比较原始的AJAS代码。 ps:在项目中如果要访问网络资源,不管是图片文件还是网络请求,必须给项目开放权限。 (1)网络连接方式 HTTP数…...

Golang 的 GMP 协程模型详解

Golang 的 GMP 协程模型详解 Golang 的并发模型基于 GMP(Goroutine-M-Processor) 机制,是其高并发能力的核心支撑。以下从原理、机制、优势、缺点和设计理念展开分析: 一、GMP 的组成与运作原理 Goroutine(G&#xff…...

ReportLab 导出 PDF(页面布局)

ReportLab 导出 PDF(文档创建) ReportLab 导出 PDF(页面布局) ReportLab 导出 PDF(图文表格) PLATYPUS - 页面布局和排版 1. 设计目标2. 开始3. Flowables3.1. Flowable.draw()3.2. Flowable.drawOn(canvas,x,y)3.3. F…...

Ubuntu 安装与配置 Docker

Ubuntu 安装与配置 Docker Docker 是一个开源的容器化平台,允许开发者将应用程序及其依赖项打包在一个轻量级、可移植的容器中。它可以帮助开发者和运维人员快速构建、部署和管理应用程序,提升开发和运维效率。本文将介绍如何在 Ubuntu 系统上安装和配置…...

【数据结构与算法】LeetCode每日一题

此题跟27.移除数组中的指定值 类似,都是移除且双指针玩法,只不过判断条件发生了变化...

【HDFS入门】数据存储原理全解,从分块到复制的完整流程剖析

目录 1 HDFS架构概览 2 文件分块机制 2.1 为什么需要分块? 2.2 块大小配置 3 数据写入流程 4 数据复制机制 4.1 副本放置策略 4.2 复制流程 5 数据读取流程 6 一致性模型 7 容错机制 7.1 数据节点故障处理 7.2 校验和验证 8 总结 在大数据时代&#x…...

力扣热题100——普通数组(不普通)

普通数组但一点不普通! 最大子数组和合并区间轮转数组除自身以外数组的乘积缺失的第一个正数 最大子数组和 这道题是非常经典的适用动态规划解决题目,但同时这里给出两种解法 动态规划、分治法 那么动态规划方法大家可以在我的另外一篇博客总结中看到&am…...

Ubuntu中snap

通过Snap可以安装众多的软件包。需要注意的是,snap是一种全新的软件包管理方式,它类似一个容器拥有一个应用程序所有的文件和库,各个应用程序之间完全独立。所以使用snap包的好处就是它解决了应用程序之间的依赖问题,使应用程序之…...

uniapp(Vue)开发微信小程序 之 保存图片到本地

一、保存图片到本地(要拿到图片的 src): 查看隐私条约是否加上相册(仅写入)权限: 微信公众平台 -》 左下角头像 -》账号设置 -》 用户隐私保护指引 -》去完善 -》 相册(仅写入)权限 …...

TailwindCss快速上手

什么是Tailwind Css? 一个实用优先的 CSS 框架,可以直接在标记中组合以构建任何设计。 开始使用Tailwind Css 如何安装 下面是使用vite构建工具的方法 ①安装 Tailwind CSS: tailwindcss通过tailwindcss/vitenpm安装。 npm install tailwindcss tailwindcss…...

Gladinet CentreStack Triofox 远程RCE漏洞(CVE-2025-30406)

免责声明 本文档所述漏洞详情及复现方法仅限用于合法授权的安全研究和学术教育用途。任何个人或组织不得利用本文内容从事未经许可的渗透测试、网络攻击或其他违法行为。使用者应确保其行为符合相关法律法规,并取得目标系统的明确授权。 对于因不当使用本文信息而造成的任何直…...

ASP.NET WEB 手动推送 URL 到百度站长工具实例

下面是一个完整的 ASP.NET Web 应用程序示例,演示如何手动推送 URL 到百度站长工具。 1. 创建推送页面 (PushToBaidu.aspx) <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="PushToBaidu.aspx.cs" Inherits="BaiduPushEx…...

【Ragflow】18.更好的推理框架:vLLM的docker部署方式

概述 看到不少人说“Ollama就图一乐,生产环境还得用vLLM”。 本文决定使用docker对vLLM进行部署,并解决模型配置中,IP地址的硬编码问题。 Ollama与vLLM风评比较 查询相关资料,Ollama与vLLM主要特点及对比情况如下[1]: Ollama:轻量级本地大模型部署工具,面向个人用户…...

智能 GitHub Copilot 副驾驶® 更新升级!

智能 GitHub Copilot 副驾驶 迎来重大升级&#xff01;现在&#xff0c;所有 VS Code 用户都能体验支持 Multi-Context Protocol&#xff08;MCP&#xff09;的全新 Agent Mode。此外&#xff0c;微软还推出了智能 GitHub Copilot 副驾驶 Pro 订阅计划&#xff0c;提供更强大的…...

什么是高防服务器

高防服务器是具备高强度防御能力、专门应对网络攻击(如DDoS、 CC攻击)的服务器类 型&#xff0c;通过流量清洗、多层防护等技术保障业务稳定运行。具备高强度防御能力和智能攻击识别技术&#xff0c;可保障业务在极端网络环境下稳定运行。其核心特点及技术原理如下&#xff1a…...

纷析云开源财务软件:企业财务数字化转型的灵活解决方案

纷析云是一家专注于开源财务软件研发的公司&#xff0c;自2018年成立以来&#xff0c;始终以“开源开放”为核心理念&#xff0c;致力于通过技术创新助力企业实现财务管理的数字化与智能化转型。其开源财务软件凭借高扩展性、灵活部署和全面的功能模块&#xff0c;成为众多企业…...

open webui 介绍 是一个可扩展、功能丰富且用户友好的本地部署 AI 平台,支持完全离线运行。

AI MCP 系列 AgentGPT-01-入门介绍 Browser-use 是连接你的AI代理与浏览器的最简单方式 AI MCP(大模型上下文)-01-入门介绍 AI MCP(大模型上下文)-02-awesome-mcp-servers 精选的 MCP 服务器 AI MCP(大模型上下文)-03-open webui 介绍 是一个可扩展、功能丰富且用户友好的…...

Spring缓存抽象机制

一、核心架构图解 #mermaid-svg-pUShmqsPanYTNVBI {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-pUShmqsPanYTNVBI .error-icon{fill:#552222;}#mermaid-svg-pUShmqsPanYTNVBI .error-text{fill:#552222;stroke:#5…...

[Jenkins]pnpm install ‘pnpm‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。

这个错误提示再次说明&#xff1a;你的系统&#xff08;CMD 或 Jenkins 环境&#xff09;找不到 pnpm 命令的位置。虽然你可能已经用 npm install -g pnpm 安装过&#xff0c;但系统不知道它装在哪里&#xff0c;也就无法执行 pnpm 命令。 ✅ 快速解决方法&#xff1a;直接用完…...

如何用AI辅助数据分析及工具推荐

以下是针对数据分析的 AI辅助工具推荐&#xff0c;结合国内外主流工具的功能特点、优劣势及适用场景分析&#xff0c;并标注是否为国内软件及付费情况&#xff1a; 一、国内工具推荐 1. WPS AI 特点&#xff1a;集成于WPS Office套件&#xff0c;支持智能数据分析、自动生成可…...

使用KeilAssistant代替keil的UI界面

目录 一、keil Assistant的优势和缺点 二、使用方法 &#xff08;1&#xff09;配置keil的路径 &#xff08;2&#xff09;导入并使用工程 &#xff08;3&#xff09;默认使用keil自带的ARM编译器而非GUN工具链 一、keil Assistant的优势和缺点 在日常学…...

spark-SQL数据加载和保存

数据加载与保存 通用方式&#xff1a; 通过 spark.read.load 和 df.write.save 实现数据加载与保存。可利用 format 指定数据格式&#xff0c;如 csv 、 jdbc 等&#xff1b; option 用于设置特定参数&#xff0c;像 jdbc 格式下的数据库连接信息&#xff1b; load 和 save 则…...

strings.Replace 使用详解

目录 1. 官方包 2. 支持版本 3. 官方说明 4. 作用 5. 实现原理 6. 推荐使用场景和不推荐使用场景 推荐场景 不推荐场景 7. 使用场景示例 示例1&#xff1a;官方示例 示例2&#xff1a;模板变量替换 示例3&#xff1a;敏感信息脱敏&#xff08;隐藏手机号中间四位&a…...

K8S微服务部署及模拟故障观测

概述 本文介绍了如何在 Kubernetes (K8S) 集群中部署微服务&#xff0c;并模拟常见的故障场景&#xff08;如 Pod 故障、节点故障、网络故障&#xff09;以测试系统的容错能力。通过本实验&#xff0c;了解 Kubernetes 的自动恢复机制以及如何通过监控和日志分析快速定位和解决…...

3.k8s是如何工作的

Kubernetes 是一个复杂的分布式系统&#xff0c;其核心设计理念是 声明式管理 和 自动化控制。以下是 Kubernetes 的工作机制详解&#xff0c;从用户提交应用到容器运行的全流程&#xff1a; 1. 核心架构&#xff1a;控制平面&#xff08;Control Plane&#xff09;与工作节点&…...

打通任督二脉 - Device Plugin 让 k8s “看见” GPU

打通任督二脉 - Device Plugin 让 k8s “看见” GPU 上一篇咱们聊了为啥要把 GPU 这个“计算猛兽”拉进 Kubernetes (k8s) 这个“智能调度中心”。目标很美好:提高效率、简化管理、弹性伸缩。但现实是,k8s 天生并不认识 GPU 这位“新朋友”。就像你的电脑操作系统,默认只认…...

锚定“体验驱动”,锐捷EDN让园区网络“以人为本”

作者 | 曾响铃 文 | 响铃说 传统的网络升级路径&#xff0c;一如巴别塔的建造思路一般——工程师们按技术蓝图逐层堆砌&#xff0c;却常与地面用户的实际需求渐行渐远&#xff0c;从而带来了诸多体验痛点&#xff0c;如手工配置效率低下、关键业务用网无法保障、网络架构趋于…...

Flutter的自动化测试 python flutter编程

Flutter应用开发入门指南 第一步&#xff1a;创建Flutter应用 创建一个默认的Flutter应用后&#xff0c;将以下代码复制到 lib/main.dart 中&#xff1a; import package:flutter/material.dart;//运行Flutter应用,创建了一个自己实现的Widget对象 void main() > runApp(…...

Day09【基于jieba分词和RNN实现的简单中文分词】

基于jieba分词和RNN实现的中文分词 目标数据准备主程序预测效果 目标 本文基于给定的中文词表&#xff0c;将输入的文本基于jieba分词分割为若干个词&#xff0c;词的末尾对应的标签为1&#xff0c;中间部分对应的标签为0&#xff0c;同时将分词后的单词基于中文词表做初步序列…...

机器学习 | 神经网络介绍 | 概念向

文章目录 &#x1f4da;从生物神经元到人工神经元&#x1f4da;神经网络初识&#x1f407;激活函数——让神经元“动起来”&#x1f407;权重与偏置——调整信息的重要性&#x1f407;训练神经网络——学习的过程&#x1f407;过拟合与正则化——避免“死记硬背” &#x1f440…...

使用cursor进行原型图设计

1.下载cursor 2.模式设置&#xff1a; 模型使用claude-3.7-sonnet的think模式 3.引导词模板&#xff1a; 我想要开发一个中高考英语口语考试的模拟考试系统&#xff0c;我需要将上面的这个应用输出成高保真的原型图设计。请考虑以下的规范&#xff1a; 用户体验&#xff1…...

Vue el-from的el-form-item v-for循环表单如何校验rules(二)

在上一篇文章中&#xff0c;通过校验规则写成内联循环去校验from表单项&#xff0c;在之前的代码基础上&#xff0c;进行校验规则的二次封装&#xff0c;使代码更加简洁&#xff0c;灵活高效、 参考上一篇&#xff1a;Vue el-from的el-form-item v-for循环表单如何校验rules&a…...

Spark-SQL3

Spark-SQL 一.Spark-SQL核心编程&#xff08;四&#xff09; 1.数据加载与保存&#xff1a; 1&#xff09;通用方式&#xff1a; SparkSQL 提供了通用的保存数据和数据加载的方式。这里的通用指的是使用相同的API&#xff0c;根据不同的参数读取和保存不同格式的数据&#…...

Redis字符串类型实战:解锁五大高频应用场景

精心整理了最新的面试资料和简历模板&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 Redis的字符串&#xff08;String&#xff09;类型是最基础的数据结构&#xff0c;但其灵活性和原子性操作使其成为解决高并发场景问题的利器。本文通过真实项…...

通信算法之266: 无人机信号带宽计算

pwelch 通常返回功率谱密度&#xff08;PSD&#xff09;和对应的频率向量。带宽的计算可能涉及到找到 PSD 的有效频率范围&#xff0c;比如半功率点&#xff08;-3dB&#xff09;或者根据信号的能量集中区域。 pwelch 的参数设置&#xff0c;比如窗函数、重叠、FFT 点数&#x…...

【MySQL】前缀索引、索引下推、访问方法,自适应哈希索引

最左前缀原则 对于INDEX(name, age)来说最左前缀可以是联合索引的最左N个字段, 也可以是字符串索引的最左M个字符。 SELECT * FROM t WHERE name LIKE 张%其效果和单独创建一个INDEX(name)的效果是一样的若通过调整索引字段的顺序, 可以少维护一个索引树, 那么这个顺序就是需要…...

【C++游戏引擎开发】第16篇:ImGui指南

ImGui官方Github ImGUI(即时模式图形用户界面)是一种颠覆传统GUI开发范式的界面系统,由Casey Muratori于2005年提出概念,后经Omar Cornut开发为Dear ImGui开源库。其核心设计理念彻底改变了开发者构建交互式工具的方式。 一、vcpkg安装与特点介绍 1.1 安装 vcpkg install…...

分享一下这几天在公司学到的东西

这几天我学到了很多东西 &#xff08;1&#xff09;我自己原来写项目&#xff0c;前后端联调用的都是postman&#xff0c;然后直接测试接口&#xff0c;然后连一下就完了。这几天我接触到了apifox的Mock这个东西&#xff01;我知道了一个前端工程师进行前后端链条的时候&#…...

C# 将Excel格式文件导入到界面中,用datagridview显示

界面按钮不做介绍。 主要代码: //用于获取从上一个页面传过来datagridview标题 public DataTable GetHeader { get; set; } private void UI_EXPINFO_Load(object sender, EventArgs e) { //页面加载显示listbox1中可…...

Shell编程之正则表达式与文本

目录 一 正则表达式 1 正则表达式的定义 2 正则表达式用途 二 正则表达式类型 1 基础正则表达式示例 &#xff08;1&#xff09;查找特定字符 &#xff08;2&#xff09;利用中括号” [] “来查找集合字符 &#xff08;3&#xff09;查找行首” ^ “与行尾字符”$“ &…...

Spring JDBC 与数据访问:从性能优化到事务协同

在高并发场景&#xff08;如电商、金融等行业&#xff09;&#xff0c;数据库访问的性能和事务一致性是系统稳定性的关键。 Spring JDBC通过模板化操作和事务管理机制&#xff0c;大幅简化了传统 JDBC 繁琐的 API 处理&#xff0c;使数据库操作更加高效、安全、可维护。 一、…...

Markdown 编辑器的使用

欢迎使用 Markdown 编辑器 你好&#xff01; 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章&#xff0c;了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持&…...

自动化浏览器环境与 Node.js 环境的逆向分析:完整教程

在当今的 Web 开发中&#xff0c;了解浏览器环境与 Node.js 环境之间的差异是非常重要的&#xff0c;特别是当你希望进行自动化操作、逆向工程或进行跨平台开发时。在这篇教程中&#xff0c;我们将探讨如何通过 JavaScript 在浏览器中自动化环境检测、分析并对比 Node.js 和浏览…...