useMemo + memo + useContext 性能优化实战:从无感重渲染到丝滑体验
在 Vue 中我们可能依赖 Vuex + computed 进行状态共享和性能优化,而在 React 里呢?不需要用 Redux,靠
useContext
、memo
、useMemo
三剑客就能构建高性能组件通信方案!
🧩 useContext 再回顾:状态共享不等于性能优化
上篇问题我们讲了 useContext
实现全局状态管理,但也提到了 useContext
引起的性能问题:
“每当
useContext
内的数据发生变化,都会导致 所有使用useContext()
的组件重新渲染。”
const ThemeContext = createContext('light');function App() {return (<ThemeContext.Provider value="dark"><Toolbar /></ThemeContext.Provider>);
}function Toolbar() {return <ThemedButton />;
}function ThemedButton() {const theme = useContext(ThemeContext);return <button className={theme}>按钮</button>;
}
虽然 useContext
很好用,但它有一个致命的性能问题:只要 Provider
的 value
改变,所有用到这个 context
的组件都会重新渲染,哪怕组件内部根本没用到变化的值。
useContext
本身并不具备“避免不必要渲染”的能力。
接下来,我们将通过一个实际项目场景,讲解如何组合使用 useMemo
、memo
和 useContext
,从而将一次看似不起眼的性能问题,打磨成用户几乎无感的丝滑体验。
🧩 回顾三剑客
简单回顾下三剑客(想详细了解更多概念的请翻阅之前文章):
🟦 useContext
- 用于在组件树中共享状态
- 类似 Vue 的
provide
/inject
const ThemeContext = createContext();
const value = useContext(ThemeContext);
🟩 memo
- 用于缓存组件结构
- 类似 Vue 的
v-memo
+pureComponent
行为
const MemoComponent = memo(Component);
🟨 useMemo
- 用于缓存变量值或对象引用,避免不必要计算或更新
- 类似 Vue 的
computed
(但是手动依赖)
const memoizedValue = useMemo(() => computeVal(), [deps]);
三剑客作用
Hook | 作用 |
---|---|
useContext | 跨组件传递状态 |
memo | 记忆组件,避免无意义的重新渲染 |
useMemo | 记忆复杂数据或对象,避免引用变化导致子组件更新 |
三者组合的思路是:
“将不会变的值用
useMemo
缓存,传给Context
,再通过memo
包裹真正消费这些值的子组件。”
🧩 场景背景
你在开发一个社交 App 的文章详情页,页面中包含:
- 一篇文章信息
- 一组评论列表(
CommentList
) - 一个点赞按钮(
LikeButton
)
点赞按钮点击后只影响点赞数,但由于组件结构未优化,整个评论列表也会 无意义刷新 —— 这是我们要优化的核心问题。
❌ 优化前代码(每次点赞导致所有子组件刷新)
import { useState } from "react";export default function App() {const [likes, setLikes] = useState(0);const [comments] = useState([{ id: 1, author: "张三", content: "写得真好!" },{ id: 2, author: "李四", content: "受教了!" },]);return (<div><LikeButton likes={likes} onLike={() => setLikes(likes + 1)} /><CommentList comments={comments} /></div>);
}function LikeButton({ likes, onLike }) {return <button onClick={onLike}>👍 点赞 ({likes})</button>;
}function CommentList({ comments }) {console.log("CommentList 渲染");return (<ul>{comments.map((comment) => (<li key={comment.id}><strong>{comment.author}:</strong>{comment.content}</li>))}</ul>);
}
痛点分析:
- 每次点击点赞按钮,父组件
App
重新渲染。 - 尽管
comments
没有变化,CommentList
仍然重新渲染。
✅ 简单,用 memo 直接解决
import { useState, memo } from "react";const MemoCommentList = memo(CommentList);export default function App() {const [likes, setLikes] = useState(0);const [comments] = useState([{ id: 1, author: "张三", content: "写得真好!" },{ id: 2, author: "李四", content: "受教了!" },]);return (<div><LikeButton likes={likes} onLike={() => setLikes(likes + 1)} /><MemoCommentList comments={comments} /></div>);
}
...
我们引入 memo
,创建 memo
组件 MemoCommentList
,此时再看:
哦豁!?这就解决了?如此简单?
此时一位热心网友 JiangJiang 出现了,他也想来发表评论:
此时评论区来了位 帅哥-JiangJiang,他也想发表评论:
import { useState, memo, createContext, useContext } from "react";const CommentContext = createContext(null);
const MemoCommentList = memo(CommentList);export default function App() {const [likes, setLikes] = useState(0);const [comments, setComments] = useState([{ id: 1, author: "张三", content: "写得真好!" },{ id: 2, author: "李四", content: "受教了!" },]);return (<div><CommentContext.Provider value={{ comments, setComments }}><LikeButton likes={likes} onLike={() => setLikes(likes + 1)} /><MemoCommentList /></CommentContext.Provider></div>);
}function LikeButton({ likes, onLike }) {return <button onClick={onLike}>👍 点赞 ({likes})</button>;
}function CommentList() {const { comments } = useContext(CommentContext);console.log("CommentList 渲染");return (<><ul>{comments.map((comment) => (<li key={comment.id}><strong>{comment.author}:</strong>{comment.content}</li>))}</ul><SendRemark /></>);
}function SendRemark() {const { comments, setComments } = useContext(CommentContext);const handleAdd = () => {const newComment = {id: comments.length + 1,author: "JiangJiang",content: "这篇文章不错!",};setComments([...comments, newComment]);};return <button onClick={handleAdd}>路过的 JiangJiang</button>;
}
补充了下逻辑:
- 新增
SendRemark
组件给 JiangJiang 发表评论。 - 组件层级比较深,我们使用
useContext
来进行状态管理。 - 评论区数据
comments
改为从context
中获取。
我们再来看:
恩,路过的 JiangJiang
发表了评论,导致 comments
数据变更,引起 CommentList
重新渲染,这没问题。
但是…为什么点赞又引起了 CommentList
的重新渲染?刚刚使用 memo
不是已经解决了?
就像我路过评论区,却因为点赞被拉进去挨了一顿重渲染的“毒打”……
问题出现在哪里?就在 context
上:
1.context
对象引用变化
CommentContext.Provider
的 value
中传递了一个新对象:
value={{ comments, setComments }}
每次 App
组件渲染(比如点赞时 likes
变化),这个对象都会被重新创建,即使内容未变,但引用地址变化了。
2.memo
对 context
无效
memo
只能阻止 props 变化导致的渲染,但 当组件消费的 Context 值变化时(即使内容相同但引用变化),memo
也无法阻止渲染。
知道了问题所在,那有什么办法可以缓存整个 Context 的 value 对象,保持引用稳定?
答案就是:useMemo
✅ memo + useMemo + useContext:三剑客联动优化
使用 useMemo
解决上面问题,缓存 value
:
import { useState, memo, createContext, useContext, useMemo } from "react";const CommentContext = createContext(null);
const MemoCommentList = memo(CommentList);
const useMemoComments = () => useContext(CommentContext);export default function App() {const [likes, setLikes] = useState(0);const [comments, setComments] = useState([{ id: 1, author: "张三", content: "写得真好!" },{ id: 2, author: "李四", content: "受教了!" },]);const memoComments = useMemo(() => ({ comments, setComments }), [comments]);return (<div><CommentContext.Provider value={memoComments}><LikeButton likes={likes} onLike={() => setLikes(likes + 1)} /><MemoCommentList /></CommentContext.Provider></div>);
}function LikeButton({ likes, onLike }) {return <button onClick={onLike}>👍 点赞 ({likes})</button>;
}function CommentList() {const { comments } = useMemoComments();console.log("CommentList 渲染");return (<><ul>{comments.map((comment) => (<li key={comment.id}><strong>{comment.author}:</strong>{comment.content}</li>))}</ul><SendRemark /></>);
}function SendRemark() {const { comments, setComments } = useMemoComments();const handleAdd = () => {const newComment = {id: comments.length + 1,author: "JiangJiang",content: "这篇文章不错!",};setComments([...comments, newComment]);};return <button onClick={handleAdd}>路过的 JiangJiang</button>;
}
我们加上了:
- 使用
useMemo
缓存context
传入的value
。 - 自定义了
Hook:useMemoComments
,方便导出数据。
此时就大功告成了,改变数据也不会引起不相关组件更新:
相对比优化前的代码,我们做了什么?
- 使用
memo
保证子组件只在真正依赖的数据变化是才更新。 - 配合
useContext
进行全局状态管理。 - 使用
useMemo
缓存context value
值,解决不相关组件也随数据更新问题。
🎯 优化效果对比
优化前
优化后
🧠 总结:三者配合的心法
useContext
虽然让跨层级传参变得优雅,但它对性能的 副作用 常常被忽视:只要 value
的引用发生变化,所有消费它的组件都会 无差别更新,哪怕这些组件并未使用发生变化的那部分值。
本文通过一个点赞 + 评论的实战场景,详细剖析了这种性能问题的根源,并通过以下三种方式给出了解决方案:
- useMemo 保持 value 稳定:避免不必要的引用变化;
- memo 缓存消费组件:提升组件重用率,减少重渲染;
- 组件职责拆分:精细控制渲染粒度,配合
memo
更高效。
当这三种策略协同配合时,能最大化发挥 React 的性能潜力,实现真正意义上的 按需渲染。
希望这篇文章能帮你更深入理解 useContext
背后的运行机制,在写业务时也能写出更高性能、更易维护的代码,如果你觉得有帮助,别忘了点个赞👍或关注我后续的 重学 React 系列!。
相关文章:
useMemo + memo + useContext 性能优化实战:从无感重渲染到丝滑体验
在 Vue 中我们可能依赖 Vuex computed 进行状态共享和性能优化,而在 React 里呢?不需要用 Redux,靠 useContext、memo、useMemo 三剑客就能构建高性能组件通信方案! 🧩 useContext 再回顾:状态共享不等于性…...
集合框架--Set集合详解
set集合 set 系列集合特点: 无序:存或取的元素的顺序可能是一致的,也可能不是 不重复:集合中不能存储重复的元素,我们可以利用这个特性去重 无索引:我们不可以通过索引获得set中的每一个元素 Set接口没…...
git -- 对远程仓库的操作 -- 查看,添加(与clone对比),抓取和拉取,推送(注意点,抓取更新+合并的三种方法,解决冲突,对比),移除
目录 对远程仓库的操作 介绍 查看 (git remote) 介绍 查看详细信息 添加(git remote add) 介绍 与 git clone对比 从远程仓库中抓取与拉取 抓取(git fetch) 拉取(git pull) 推送(git push) 介绍 注意 抓取更新合并的方法 git fetch git merge 解决冲突 git …...
Hadoop的三大结构及其作用
Hadoop 的三大核心结构及其作用如下: 1. 分布式文件系统(HDFS,Hadoop Distributed File System) 作用: 海量数据存储:提供高吞吐量、高容错性的分布式存储能力,支持存储 TB/PB 级的大规模数据…...
Java学习笔记--多态:多态的介绍,多态的基本使用,多态的条件下成员的访问特点,多态的好处
目录 1.多态的介绍 2.多态的基本使用 编辑 3.多态的条件下成员的访问特点 3.1成员变量 3.2成员方法 4.多态的好处(为什么学多态) 1.问题描述: 2.多态方式和原始方式new对象的优缺点: 一.多态的介绍 1.前提:a.必须有子父类继承或者接口实现关系b.必须有方法的重写(没…...
使用Python设置Excel单元格边框
在数据驱动的业务场景中,自动化设置Excel单元格边框成为提升数据处理效率的关键环节。通过程序化控制边框样式,不仅能确保海量报表格式的统一性,还能通过粗细、虚实等视觉元素强化数据逻辑层次。当面对动态更新的分析报告时,代码驱…...
ES中常用的Query和查询作用,以及SpringBoot使用实例
ES中常用的Query和查询作用,以及 SpringBoot 使用实例 文章目录 ES中常用的Query和查询作用,以及 SpringBoot 使用实例MatchAllQueryTermQueryBoolQueryRangeQueryMatchQueryMultiMatchQueryTermsQueryPrefixQueryWildcardQueryRegexpQueryFuzzyQueryDis…...
美信监控易告警:功能强大
美信监控易是一款功能强大的运维管理软件,其告警功能在保障系统稳定运行方面发挥着重要作用。 一、运维行业背景 随着信息技术的快速发展,企业的信息化程度越来越高,对 IT 系统的依赖也日益增强。IT 系统的稳定运行直接关系到企业的业务正常…...
字符串系列一>最长回文子串
目录 题目:解析:代码: 题目: 链接: link 解析: 代码: class Solution {public String longestPalindrome(String s) {char[] ss s.toCharArray();int n ss.length;int begin 0;//返回结果的起始字符串…...
CAPL编程系列_02
1_CAPL 中的运算符 在CAPL(CANoe/CANalyzer Programming Language)中,运算符用于执行各种运算操作,类似于其他编程语言。CAPL中的运算符可以分为以下几类: 1. 算术运算符 算术运算符 加法运算符 - 减法运算符*乘法运…...
AI Agents系列之构建多智能体系统
🧠 向所有学习者致敬! “学习不是装满一桶水,而是点燃一把火。” —— 叶芝 我的博客主页: https://lizheng.blog.csdn.net 🌐 欢迎点击加入AI人工智能社区! 🚀 让我们一起努力,共创…...
FPGA学习——DE2-115开发板上设计波形发生器
1. 实验目的 掌握直接数字频率合成(DDS)技术的基本原理和应用。使用DE2-115开发板实现正弦波和方波的生成。使用SignalTap II嵌入式逻辑分析仪测试输出波形的离散数据。 2. 实验原理 DDS技术:通过相位累加器生成相位信息,结合波…...
51单片机实验二:数码管静态显示
目录 一、实验环境与实验器材 二、实验内容及实验步骤 1.单个数码管显示 2.六个数码管依次从0~F变换显示 3.proteus仿真 一、实验环境与实验器材 环境:Keli,STC-ISP烧写软件,Proteus. 器材:TX-1C单片机(STC89C52RC…...
JavaScript性能优化实战指南
1. 引言 JavaScript作为现代Web开发的核心技术,为网页带来了丰富的交互性和动态功能。然而,随着Web应用日益复杂,JavaScript代码的性能成为影响用户体验的关键因素。性能不佳的JavaScript可能导致页面加载缓慢、交互卡顿、甚至浏览器无响应&…...
POSIX 信号量(Semaphore)
一、POSIX 信号量基础 1. 什么是信号量? 信号量 是一种同步机制,用于控制对共享资源的访问。它通过一个整数值表示可用资源的数量,支持两种原子操作: P操作(Wait):尝试减少信号量值࿰…...
深度学习驱动下的字符识别:挑战与创新
一、引言 1.1 研究背景 深度学习在字符识别领域具有至关重要的地位。随着信息技术的飞速发展,对字符识别的准确性和效率要求越来越高。字符识别作为计算机视觉领域的一个重要研究方向,其主要目的是将各种形式的字符转换成计算机可识别的文本信息。近年…...
DOM TreeWalker API 详解
DOM TreeWalker API 详解 TreeWalker API 是 DOM 中一个强大但相对较少使用的功能,它提供了一种有效遍历文档树的方式。它比手动递归或使用简单的节点导航方法更加灵活和高效。 TreeWalker 基本概念 TreeWalker 对象可以让你按照指定的过滤条件,以特定…...
深度学习| Deep Snake环境配置+训练+预测评估(超全面)
前言:Deep Snake是一个比较经典结合了轮廓的深度学习分割方法,但是去实际运行Deep Snake项目的时候遇到了很多问题。这篇文章把Deep Snake从环境配置、训练到预测评估,都做了详细的教程,还补充了一些相关的知识点。 Deep Snake配置和运行 Deep Snake信息数据集COCOMask-&g…...
NHANES指标推荐:CMI
文章题目:Association between cardiometabolic index and biological ageing among adults: a population-based study DOI:10.1186/s12889-025-22053-3 中文标题:成年人心脏代谢指数与生物衰老之间的关系:一项基于人群的研究 发…...
非比较排序——计数排序
计数排序 计数排序是非比较排序 void CountSort(int *a,int n) {//找范围int mina[0],maxa[0];for(int i0;i<n;i){if(a[i]<min){mina[i];}if(a[i]>max){mina[i];}}int rangemax-min1;//创建计数用的数组int *count(int *) malloc(range* sizeof(int));//计数数组的元…...
spring cloud gateway前面是否必须要有个nginx
在 **"客户端 → Nginx (前置限流) → Spring Cloud Gateway → 微服务(Sentinel 熔断限流)"** 的架构中,**Spring Cloud Gateway 前面并不强制要求必须有 Nginx**,是否需要取决于具体场景。以下是详细分析: 一、必须使用 Nginx 的…...
复现SCI图像增强(Toward fast, flexible, and robust low-light image enhancement.)
运行train.py报错 > File "/home/uriky/桌面/SCI-main/SCI-main/train.py", line 105, in main > train_queue torch.utils.data.DataLoader( File "/home/uriky/anaconda3/envs/AA/lib/python3.8/site-packages/torch/utils/data/dataloader.py&q…...
Linux 进程
文章目录 1. 冯诺依曼体系结构1.1 什么是冯诺依曼体系结构1.2 为什么选择冯诺依曼结构 2. 操作系统2.1 操作系统是什么2.2 操作系统如何对硬件资源进行管理2.3 计算机的层状体系结构 3. 进程3.1 进程是什么3.2 进程的相关属性3.3 在Linux中了解进程3.3.1 查看进程3.3.2 子进程由…...
TVM计算图分割--Collage
1 背景 为满足高效部署的需要,整合大量优化的tensor代数库和运行时做为后端成为必要之举。现在的深度学习后端可以分为两类:1)算子库(operator kernel libraries),为每个DL算子单独提供高效地低阶kernel实现。这些库一般也支持算…...
Liunx知识点
1./dev:是系统设备文件存放位置 /home:是普通用户存放目录 /etc:大部分配置文件的存放目录 /mnt:挂载服务需要的目录 /tmp:存放临时文件 /boot:启动文件 /root:root用户存放目录 /var&am…...
全栈架构设计图
以下是针对Vue前端、服务端、管理后台及数据库的架构图和交互流程设计,采用分层结构和模块化设计思路: 一、系统整体架构图 #mermaid-svg-vAtZ3R6d5Ujm6lYT {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}…...
【SAP ME 42】SAP ME 性能改进
性能问题症状 可观察到以下症状:com.sap.me.production$SfcStartService#startSfc - 此 API 方法具有来自 RESOURCE_TYPE_RESOURCE 表的 SQL 查询的运行速度较慢。 com.sap.me.production$CreateSfcService#createSfc - 对于每个创建的车间作业控制,检查在计划标准配置中是否…...
《GPT-4.1深度解析:AI进化新标杆,如何重塑行业未来?》
一、GPT-4.1:AI 领域的 “全能战士” 降临 1.1 发布背景与战略意义 在 OpenAI 的技术迭代版图中,GPT-4.1 被赋予了 “承前启后” 的关键角色。它不仅是 GPT-4o 的全面升级版,更被视为向 GPT-5 过渡的重要桥梁。2025 年 4 月 15 日的发布会上,OpenAI 宣布 GPT-4.1 系列模型…...
node.js 基础
模块导入和导出 形式1 function get_jenkins(){return "jenkins....." }function test_cc(){return "4444444" }export {get_jenkins,test_cc}// 主函数 import { get_jenkins, test_cc } from ./module.js;console.log(get_jenkins()); console.log(tes…...
数据结构中的宝藏秘籍之广义表
广义表,也被称作列表(Lists),是一种递归的数据结构。它就像一个神秘的盒子,既可以装着单个元素(原子),也可以嵌套着其他的盒子(子列表)。比如广义表 (a (b c)…...
电流模式控制学习
电流模式控制 电流模式控制(CMC)是开关电源中广泛使用的一种控制策略,其核心思想是通过内环电流反馈和外环电压反馈共同调节占空比。相比电压模式控制,CMC具有更快的动态响应和更好的稳定性,但也存在一些固有缺点。 …...
汽车免拆诊断案例 | 2011款雪铁龙世嘉车刮水器偶尔自动工作
故障现象 一辆2011款雪铁龙世嘉车,搭载1.6 L 发动机,累计行驶里程约为19.8万km。车主反映,该车刮水器偶尔会自动工作,且前照灯偶尔会自动点亮。 故障诊断 接车后试车发现,除了上述故障现象以外,当用遥控器…...
#去除知乎中“盐选”付费故事
添加油猴脚本,去除知乎中“盐选”付费故事 // UserScript // name 盐选内容隐藏脚本 // namespace http://tampermonkey.net/ // version 0.2 // description 自动隐藏含有“盐选专栏”或“盐选”文字的回答卡片 // author YourName // mat…...
github 项目迁移到 gitee
1. 查看远程仓库地址 git remote -v 2. 修改远程仓库地址 确保 origin 指向你的 Gitee 仓库,如果不是,修改远程地址。 git remote set-url origin https://gitee.com/***/project.git 3. 查看本地分支 git branch 4. 推送所有本地分支 git p…...
2025年03月中国电子学会青少年软件编程(Python)等级考试试卷(五级)答案 + 解析
青少年软件编程(Python)等级考试试卷(五级) 分数:100 题数:38 一、单选题(共25题,共50分) 1. 以下哪个选项不是Python中的推导式?( ) A. 列表推导式 B. 字典推导式 C. 集合推导式 D. 元组推导式 正确答案:D 答案解析:Python中的推导式包括列表推导式、字典推导式…...
[Unity]-[UI]-[Prefab] 关于UGUI UI Prefab的制作技巧
从上到下,从外到里,多用空物体套壳 这个意思就是说在使用ugui时制作prefab时,要遵循“从上到下,从外到里,多用空物体套壳”的原则,好处就是后面好修改,并且可以复用不同的prefab子模块。且在布…...
【Reading Notes】(8.3)Favorite Articles from 2025 March
【March】 雷军一度登顶中国首富,太厉害了(2025年03月02日) 早盘,小米港股一路高歌猛进,暴涨4%,股价直接飙到52港元的历史新高。这一波猛如虎的操作,直接把雷军的身家拉到了2980亿元,…...
2021-11-09 C++倍数11各位和为13
缘由c函数题找数字的-编程语言-CSDN问答 void 倍数11各位和为13(int n, int& b, int* h) {//缘由https://ask.csdn.net/questions/7559803?spm1005.2025.3001.5141b !(n % 11);while(n)*h n % 10, n / 10; }int a 1, b 1, c 0, d 0;while (a < 100){倍数11各位和…...
2025年03月中国电子学会青少年软件编程(Python)等级考试试卷(六级)真题
青少年软件编程(Python)等级考试试卷(六级) 分数:100 题数:38 答案解析:https://blog.csdn.net/qq_33897084/article/details/147341458 一、单选题(共25题,共50分) 1. 在tkinter的…...
Linux简介
一、Linux 简介 Linux 内核最初只是由芬兰人林纳斯托瓦兹(Linus Torvalds)在赫尔辛基大学上学时出于个人爱好而编写的。 Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 UNIX 的多用户、多任务、支持多线程和多 CP…...
每天学一个 Linux 命令(22):pwd
可访问网站查看,视觉品味拉满: http://www.616vip.cn/22/index.html pwd 命令用于打印当前工作目录(Print Working Directory)的绝对路径,帮助用户快速确认自己在文件系统中的位置。虽然简单,但它是终端操作中不可或缺的基础命令,尤其在处理相对路径或脚本编写时尤为…...
Windows 11设置开机自动运行 .jar 文件
Windows 11设置开机自动运行 .jar 文件 打开启动文件夹: 按下 Win R,输入 shell:startup,回车。 此路径为当前用户的启动文件夹: C:\Users\<用户名>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup创…...
西门子 博途 软件 崩溃
西门子 博途 软件 编译/仿真 崩溃 是因为项目中OPC UA的接口问题 解决拌饭见 https://support.industry.siemens.com/cs/document/109971630/tia-portal-%E5%9C%A8%E7%BC%96%E8%AF%91-plc-%E6%97%B6%E5%B4%A9%E6%BA%83?dti0&dlzh&lcen-WW...
12芯束装光纤不同包层线颜色之间的排列顺序
为什么光纤线必须按照以下颜色顺序进行排序?这其实是为了防止光污染的问题,不同颜色在传递光时从包层表皮漏光传感到梳妆的其它纤芯上,会有光污染的问题,而为了减少并防止光污染的现象,所以在光通信之中,需…...
数据驱动、精准协同:高端装备制造业三位一体生产管控体系构建
开篇引入 鉴于集团全面推行生产运营体建设以及对二级单位生产过程管控力度逐步加强,某高端装备制造企业生产部长王总正在开展新的一年企业生产管控规划工作,为了能够更好地进行体系规划与建设应用,特邀请智能制造专家小智来进行讨论交流。 王…...
HAL详解
一、直通式HAL 这里使用一个案例来介绍直通式HAL,选择MTK的NFC HIDL 1.0为例,因为比较简单,代码量也比较小,其源码路径:vendor/hardware/interfaces/nfc/1.0/ 1、NFC HAL的定义 1)NFC HAL数据类型 通常定…...
RAG知识库中引入MCP
MCP(Memory, Context, Planning)是一种增强AI系统认知能力的框架。将MCP引入RAG知识库可以显著提升系统的性能和用户体验。下面我将详细介绍如何实现这一整合。 MCP框架概述 MCP框架包含三个核心组件: Memory(记忆):存储和管理历史交互和知识Context(上下文):理解当…...
再读bert(Bidirectional Encoder Representations from Transformers)
再读 BERT,仿佛在数字丛林中邂逅一位古老而智慧的先知。初次相见时,惊叹于它以 Transformer 架构为罗盘,在预训练与微调的星河中精准导航,打破 NLP 领域长久以来的迷雾。而如今,书页间跃动的不再仅是 Attention 机制精…...
C# 单例模式
创建一个类 在类中定义方法 internal class Config {// 实现单利模式private static Config instance null;private Config() { }private static object Locker new object(); // 定义lock锁// 通过公有的方法 返回实力public static Config GetInstance(){// 空的自己构造…...
mainwidget.cpp:1741:21: error: use of undeclared identifier ‘mainTab‘
这个错误表明在你的代码中,mainTab 这个变量没有被正确声明或定义。这通常是因为以下原因之一: 变量未声明:mainTab 可能没有在类的成员变量中声明。 变量未初始化:mainTab 可能没有在构造函数中正确初始化。 作用域问题&#x…...