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

React从基础入门到高级实战:React 高级主题 - 性能优化:深入探索与实践指南

React 性能优化:深入探索与实践指南

引言

在现代Web开发中,尤其是2025年的技术环境下,React应用的性能优化已成为开发者不可忽视的核心课题。随着用户对应用速度和体验的要求日益提高,React应用的规模和复杂性不断增加,性能瓶颈问题逐渐暴露。特别是在大数据渲染、实时交互、跨设备适配等场景下,如何高效优化React应用的渲染性能和资源加载效率,成为开发者面临的重大挑战。

React凭借其声明式编程和组件化设计的优势,极大地提升了开发效率。然而,在大规模应用中,若使用不当,这些优势可能转化为性能隐患。因此,深入掌握React性能优化的技术,不仅能显著提升应用的用户体验,还能为未来的技术趋势(如WebAssembly、AI驱动开发、Server Components等)奠定基础。

本文旨在提供一篇内容丰富、技术深入的React性能优化指南,涵盖从性能瓶颈分析到具体优化技巧,再到高级技术和实践案例的全方位内容。我们将从React Profiler的诊断开始,深入探讨useMemouseCallbackReact.memo等核心优化工具,分析虚拟化列表、懒加载与代码分割等高级策略,并通过大数据表格优化的案例和虚拟滚动练习,帮助您将理论转化为实践。此外,我们还将展望2025年React性能优化的潜在趋势,提供前瞻性指导。希望这篇文章能成为您优化React应用的实用手册!


一、性能瓶颈分析:React Profiler 的深度剖析

优化React应用的第一步是找到性能问题的根源。React Profiler 是React DevTools中的一项强大功能,能够帮助开发者分析组件的渲染行为,精准定位性能瓶颈。

1.1 React Profiler 的核心原理

React Profiler 通过记录组件渲染的生命周期,生成直观的火焰图(Flamegraph),展示每个组件的渲染时间和层级关系。它基于React的Fiber架构运行,能够捕获每个Fiber节点的渲染耗时及触发原因。

核心功能解析
  • 渲染记录:捕获用户交互(如点击、滚动)或特定操作的渲染数据。
  • 耗时量化:测量每个组件的渲染时间,精确到毫秒。
  • 重渲染检测:识别哪些组件频繁更新,并分析其触发原因。
操作步骤
  1. 安装DevTools:确保浏览器安装了React DevTools扩展。
  2. 启动Profiler:打开DevTools,切换到“Profiler”面板,点击“Record”开始记录。
  3. 模拟操作:在应用中执行目标操作(如滚动列表、切换页面)。
  4. 分析结果:点击“Stop”,查看生成的火焰图和详细报告。
火焰图解读
  • 条形宽度:表示组件渲染的相对耗时,宽度越长,耗时越多。
  • 颜色深浅:深色表示渲染时间较长,浅色表示较短。
  • 详细信息:点击条形可查看渲染时间、重渲染次数及触发原因(如props或state变化)。

例如,在一个复杂的列表组件中,若滚动时频繁重渲染,Profiler能揭示是否是父组件的state变化导致的“连锁反应”,从而为优化提供方向。

1.2 大型项目中的应用实践

在包含数百甚至上千组件的大型应用中,Profiler的火焰图可能变得异常复杂。以下是优化分析的实用策略:

  • 组件过滤:利用Profiler的筛选功能,聚焦特定组件或模块。
  • 分段测试:将复杂操作拆分为多个小片段,逐一记录分析。
  • 热点优先:关注渲染时间最长或重渲染最频繁的组件,优先优化。
案例:仪表板优化

假设一个仪表板包含多个图表组件,加载时明显卡顿。使用Profiler记录后,发现某个图表组件每次渲染耗时超过50ms,且频繁重渲染。通过分析,发现其父组件的状态变化未被优化,导致子组件无谓更新。这为后续使用React.memo提供了明确方向。

1.3 局限性与补充工具

尽管Profiler功能强大,但它也有局限性:

  • 开发环境限制:仅适用于开发模式,无法直接反映生产环境性能。
  • 数据量有限:无法长期监控或分析复杂交互的全生命周期。
补充工具推荐
  • Web Vitals:Google提供的生产环境性能指标工具,监控CLS、LCP等核心指标。
  • Lighthouse:生成全面的性能审计报告,适用于整体优化评估。
  • Performance API:自定义性能监控,记录关键操作的耗时,如下所示:
const start = performance.now();
expensiveOperation();
const end = performance.now();
console.log(`耗时: ${end - start}ms`);

在2025年,随着AI技术的进步,智能性能分析工具可能进一步简化瓶颈定位过程。


二、核心优化技巧:从基础到高级

React提供了多种工具和钩子来优化渲染性能。以下深入探讨useMemouseCallbackReact.memo的原理、用法及应用场景。

2.1 useMemo:缓存昂贵计算的利器

useMemo通过缓存计算结果,避免重复执行高开销的操作。其核心机制是基于依赖数组的浅比较,仅在依赖变化时重新计算。

用法示例
import { useMemo } from 'react';function DataProcessor({ rawData }) {const processedData = useMemo(() => {console.log('Processing data...');return rawData.map(item => ({...item,doubled: item.value * 2,}));}, [rawData]);return <div>{processedData.map(item => item.doubled).join(', ')}</div>;
}
  • 依赖数组[rawData]确保仅在rawData变化时重新计算。
  • 引用稳定:缓存的processedData在依赖不变时保持一致。
适用场景
  • 大数据转换:如对数万条数据进行排序、过滤或聚合。
  • 复杂计算:如实时生成可视化数据或解析嵌套结构。
  • 性能敏感区域:避免因父组件重渲染导致子组件重复计算。
深度分析与权衡
  • 优势:显著降低计算开销,尤其在大数据场景下。
  • 代价:增加内存占用,缓存对象过多可能引发内存问题。
  • 注意事项
    • 依赖数组必须准确,遗漏依赖会导致结果不一致。
    • 不宜滥用,小规模计算的开销可能低于useMemo本身的比较成本。

2.2 useCallback:稳定回调函数的秘密武器

useCallback用于缓存回调函数,确保子组件接收到的函数引用保持稳定,避免不必要的重渲染。

用法示例
import { useCallback } from 'react';function ListContainer({ items }) {const handleSelect = useCallback((id) => {console.log(`Selected item: ${id}`);}, []); // 空数组表示函数引用永不更新return <ItemList items={items} onSelect={handleSelect} />;
}function ItemList({ items, onSelect }) {return items.map(item => (<button key={item.id} onClick={() => onSelect(item.id)}>{item.name}</button>));
}
  • 稳定引用handleSelect在渲染间保持一致,避免ItemList重渲染。
适用场景
  • 事件回调:父组件向子组件传递事件处理函数。
  • 依赖管理:防止因函数引用变化触发useEffect或其他副作用。
  • 高频交互:如虚拟化列表中的点击事件处理。
深度分析与权衡
  • 优势:提升子组件性能,特别在列表或复杂组件中。
  • 挑战:依赖数组管理复杂,遗漏依赖可能导致闭包问题。
  • 注意事项
    • 若回调中使用了外部变量,需加入依赖数组。
    • 对于简单场景,直接内联函数可能更简洁。

2.3 React.memo:组件渲染的精准控制

React.memo是一个高阶组件,通过缓存组件渲染结果,仅在props变化时更新,减少无谓渲染。

用法示例
import { memo } from 'react';const StaticItem = memo(function StaticItem({ text }) {console.log('Rendering StaticItem');return <div>{text}</div>;
});function App() {const [count, setCount] = useState(0);return (<><button onClick={() => setCount(count + 1)}>Increment: {count}</button><StaticItem text="不变的内容" /></>);
}
  • 默认行为StaticItem仅在text变化时重渲染,count变化不影响它。
自定义比较逻辑
const DeepItem = memo(function DeepItem({ data }) {return <div>{data.nested.value}</div>;
}, (prevProps, nextProps) => {return prevProps.data.nested.value === nextProps.data.nested.value;
});
  • 自定义比较:针对深层嵌套的props进行优化。
适用场景
  • 静态UI:props很少变化的展示组件。
  • 复杂渲染:如图表、动画等高开销组件。
  • 列表优化:结合useCallback优化列表项渲染。
深度分析与权衡
  • 优势:实现简单,效果显著。
  • 代价:自定义比较逻辑可能增加维护成本。
  • 注意事项
    • 浅比较适用于简单props,深层对象需自定义逻辑。
    • 不适合频繁更新的组件,可能得不偿失。

三、虚拟化列表:react-window 的全面指南

对于大数据列表,虚拟化技术是提升性能的关键。react-window 是一个轻量级库,通过只渲染可见区域的项,大幅减少DOM开销。

3.1 核心API与用法

react-window 提供FixedSizeListVariableSizeList,分别支持固定和动态高度的列表。

FixedSizeList 示例
import { FixedSizeList } from 'react-window';function LongList({ items }) {const Row = ({ index, style }) => (<div style={style} className="list-item">{items[index].name}</div>);return (<FixedSizeListheight={500} // 容器高度width={400}  // 容器宽度itemSize={40} // 每项固定高度itemCount={items.length} // 总项数>{Row}</FixedSizeList>);
}
  • 动态样式style由react-window生成,控制每项的位置和大小。
VariableSizeList 示例
import { VariableSizeList } from 'react-window';function DynamicList({ items }) {const getItemSize = (index) => (items[index].type === 'header' ? 60 : 30);const Row = ({ index, style }) => (<div style={style}>{items[index].content}</div>);return (<VariableSizeListheight={500}width={400}itemCount={items.length}itemSize={getItemSize}>{Row}</VariableSizeList>);
}
  • 动态高度getItemSize为每项指定高度,支持异构列表。

3.2 跨设备的适配差异

  • 移动端优化
    • 触摸支持:react-window内置滚动惯性支持。
    • 预渲染:设置overscanCount提升滚动流畅度:
      <FixedSizeList overscanCount={10} ... />
      
  • 桌面端优化
    • 样式自定义:通过CSS调整滚动条外观。
    • 键盘导航:结合ref实现焦点管理。

3.3 应用场景与优劣分析

  • 适用场景
    • 超长列表:如聊天记录、日志列表。
    • 大数据展示:如实时监控数据。
    • 移动端滚动:如新闻feed。
  • 优势
    • 性能提升:从渲染全部项到仅渲染10-20项。
    • 内存优化:DOM节点数大幅减少。
  • 局限性
    • 不支持复杂布局(如网格或瀑布流)。
    • SSR中需额外处理(如hydration)。

四、懒加载与代码分割:提升加载效率

懒加载和代码分割是优化初始加载时间的关键策略,尤其在2025年,模块化开发需求日益增长。

4.1 懒加载的实现

React通过React.lazySuspense实现按需加载。

示例
import { lazy, Suspense } from 'react';const HeavyChart = lazy(() => import('./HeavyChart'));function Dashboard() {return (<Suspense fallback={<div>Loading chart...</div>}><HeavyChart /></Suspense>);
}
  • 动态导入import()仅在组件渲染时加载。

4.2 代码分割的策略

  • 路由级分割
    • 将每个页面组件单独打包。
    • 示例(React Router):
      const Home = lazy(() => import('./Home'));
      const About = lazy(() => import('./About'));function App() {return (<Suspense fallback={<div>Loading...</div>}><Routes><Route path="/" element={<Home />} /><Route path="/about" element={<About />} /></Routes></Suspense>);
      }
      
  • 功能级分割
    • 将不常用的功能模块延迟加载,如模态框或编辑器。
  • 库分割
    • 将第三方库单独打包,提升缓存利用率。
Vite 配置
// vite.config.js
export default {build: {rollupOptions: {output: {manualChunks: {react: ['react', 'react-dom'],charts: ['chart.js'],},},},},
};
Webpack 配置
// webpack.config.js
module.exports = {optimization: {splitChunks: {chunks: 'all',cacheGroups: {vendors: {test: /[\\/]node_modules[\\/](react|react-dom)/,name: 'react-vendor',chunks: 'all',},},},},
};

4.3 SSR中的懒加载实践

在SSR中,懒加载需确保首屏内容完整性:

  • Next.js 示例
    import dynamic from 'next/dynamic';const LazyComponent = dynamic(() => import('./LazyComponent'), {ssr: false, // 禁用服务端渲染
    });
    
  • 自定义策略:在服务端预加载关键数据,客户端延迟加载非关键组件。

五、案例:优化大数据表格的渲染

通过一个包含10万行数据的表格案例,展示优化过程。

5.1 需求与挑战

  • 数据量:10万行,每行包含ID、名称、状态等字段。
  • 功能:支持滚动、筛选和排序。
  • 目标:加载流畅,滚动无卡顿。

5.2 未优化版本

function HugeTable({ data }) {return (<table><thead><tr><th>ID</th><th>Name</th><th>Status</th></tr></thead><tbody>{data.map(row => (<tr key={row.id}><td>{row.id}</td><td>{row.name}</td><td>{row.status}</td></tr>))}</tbody></table>);
}
  • 问题:渲染10万个DOM节点,浏览器直接卡死。

5.3 优化版本:虚拟化实现

import { FixedSizeList } from 'react-window';function OptimizedTable({ data }) {const Row = ({ index, style }) => (<div style={{ ...style, display: 'flex' }} className="table-row"><div style={{ width: '33%' }}>{data[index].id}</div><div style={{ width: '33%' }}>{data[index].name}</div><div style={{ width: '33%' }}>{data[index].status}</div></div>);return (<div><div style={{ display: 'flex' }} className="table-header"><div style={{ width: '33%' }}>ID</div><div style={{ width: '33%' }}>Name</div><div style={{ width: '33%' }}>Status</div></div><FixedSizeListheight={600}width={600}itemSize={40}itemCount={data.length}overscanCount={5}>{Row}</FixedSizeList></div>);
}
  • 改进:只渲染可见行,DOM节点数降至几十个。

5.4 高级优化手段

  • 分页加载
    • 将数据分片,每页加载5000条。
    • 示例:
      const [page, setPage] = useState(0);
      const pageSize = 5000;
      const paginatedData = data.slice(page * pageSize, (page + 1) * pageSize);
      
  • 列虚拟化
    • 使用react-virtualized支持水平滚动:
      import { Grid } from 'react-virtualized';function VirtualGrid({ data }) {const cellRenderer = ({ columnIndex, rowIndex, style }) => (<div style={style}>{data[rowIndex][Object.keys(data[0])[columnIndex]]}</div>);return (<GridcolumnCount={Object.keys(data[0]).length}rowCount={data.length}columnWidth={150}rowHeight={40}height={600}width={600}>{cellRenderer}</Grid>);
      }
      
  • Web Workers
    • 将筛选和排序移至后台线程:
      const worker = new Worker('worker.js');
      worker.postMessage({ type: 'filter', data });
      worker.onmessage = (e) => setFilteredData(e.data);
      
优劣对比
  • 虚拟化:实现简单,适用于滚动场景。
  • 分页:适合静态展示,但动态交互较弱。
  • Web Workers:计算性能强,但开发和调试复杂。

六、实践练习:为项目添加虚拟滚动

通过一个练习,将虚拟滚动应用到实际项目中。

6.1 练习目标

  • 目标组件:一个包含1万条数据的列表。
  • 任务:使用react-window实现虚拟滚动。
  • 要求:滚动平滑,支持动态数据。

6.2 实现步骤

  1. 安装依赖
    npm install react-window
    
  2. 改造组件
    import { FixedSizeList } from 'react-window';function VirtualizedList({ items }) {const Row = ({ index, style }) => (<div style={style} className="list-item">{items[index].title}</div>);return (<FixedSizeListheight={500}width={400}itemSize={35}itemCount={items.length}overscanCount={5}>{Row}</FixedSizeList>);
    }
    
  3. 集成到项目
    • 替换原有map渲染为VirtualizedList
    • 调整CSS确保布局一致。
  4. 测试与优化
    • 验证滚动性能。
    • 根据需要调整overscanCountitemSize

6.3 扩展应用

  • 动态更新:监听items变化,调用listRef.current.resetAfterIndex(0)重置滚动。
  • 复杂布局:结合VariableSizeList支持不同高度的项。
  • 交互支持:添加点击事件并优化性能。

七、优化注意事项与未来展望

性能优化需科学实施,以下是关键注意事项和2025年趋势预测。

7.1 React 19 的潜在特性(预测)

假设React 19在2025年发布,可能包括:

  • 自动优化:内置memouseMemo,减少手动干预。
  • 并发调度:更智能的任务优先级管理。
  • Server Components:将更多逻辑移至服务端,减轻客户端压力。

7.2 优化最佳实践与陷阱

  • 最佳实践
    • 数据驱动:先用Profiler定位问题,再优化。
    • 渐进式改进:从小范围测试开始,避免过度设计。
    • 持续监控:生产环境中使用Web Vitals跟踪效果。
  • 常见陷阱
    • 盲目优化:未分析就使用工具,增加复杂度。
    • 过度缓存:滥用useMemo导致内存溢出。
    • 忽视权衡:追求极致性能可能牺牲可读性。

7.3 性能监控工具全览

  • React Profiler:开发阶段的渲染分析。
  • Lighthouse:整体性能审计。
  • Web Vitals:生产环境核心指标。
  • Custom Metrics
    performance.mark('start');
    // 操作
    performance.mark('end');
    performance.measure('operation', 'start', 'end');
    

结语

React性能优化是一门结合理论与实践的艺术。从React Profiler的瓶颈分析,到useMemouseCallbackReact.memo的精细优化,再到虚拟化列表、懒加载与代码分割的高级技术,本文提供了全面的指导。通过大数据表格案例和虚拟滚动练习,您可以将这些知识应用于实际项目。展望2025年,React的性能优化将更加智能和高效。

相关文章:

React从基础入门到高级实战:React 高级主题 - 性能优化:深入探索与实践指南

React 性能优化&#xff1a;深入探索与实践指南 引言 在现代Web开发中&#xff0c;尤其是2025年的技术环境下&#xff0c;React应用的性能优化已成为开发者不可忽视的核心课题。随着用户对应用速度和体验的要求日益提高&#xff0c;React应用的规模和复杂性不断增加&#xff…...

负载均衡群集---Haproxy

目录 一、HAproxy 一、概念 二、核心作用 三、主要功能特性 四、应用场景 五、优势与特点 二、 案例分析 1. 案例概述 2. 案例前置知识点 &#xff08;1&#xff09;HTTP 请求 &#xff08;2&#xff09;负载均衡常用调度算法 &#xff08;3&#xff09;常见的 web …...

2025年5月个人工作生活总结

本文为 2025年5月工作生活总结。 研发编码 一个项目的临时记录 月初和另一项目同事向业主汇报方案&#xff0c;两个项目都不满意&#xff0c;后来领导做了调整&#xff0c;将项目合并&#xff0c;拆分了好几大块。原来我做的一些工作&#xff0c;如数据库、中间件等&#xff…...

【stm32开发板】单片机最小系统原理图设计

一、批量添加网络标签 可以选择浮动工具中的N&#xff0c;单独为引脚添加网络标签。 当芯片引脚非常多的时候&#xff0c;选中芯片&#xff0c;右键选择扇出网络标签/非连接标识 按住ctrl键即可选中多个引脚 点击将引脚名称填入网络名 就完成了引脚标签的批量添加 二、电源引…...

实验设计与分析(第6版,Montgomery)第5章析因设计引导5.7节思考题5.2 R语言解题

本文是实验设计与分析&#xff08;第6版&#xff0c;Montgomery著&#xff0c;傅珏生译) 第5章析因设计引导5.7节思考题5.2 R语言解题。主要涉及方差分析&#xff0c;正态假设检验&#xff0c;残差分析&#xff0c;交互作用。 dataframe<-data.frame( Surfacec(74,64,60,92…...

2025山东CCPC题解

文章目录 L - StellaD - Distributed SystemI - Square PuzzleE - Greatest Common DivisorG - Assembly Line L - Stella 题目来源&#xff1a;L - Stella 解题思路 签到题&#xff0c;因为给出的字母不是按顺序&#xff0c;可以存起来赋其值&#xff0c;然后在比较。 代码…...

【解决办法】ubuntu重启不起来,输入用户名和密码进不去,又重新返回登录页。

项目场景&#xff1a; ubuntu重启不起来&#xff0c;输入用户名和密码进不去&#xff0c;又重新返回登录页。 问题描述 在华硕天选一代笔记本上面安装了ubuntu22.04.5桌面版&#xff0c;但是重启以后出现&#xff0c;输入了用户名和密码&#xff0c;等待一会还让输入用户名和…...

CentOS Stream 9 中部署 MySQL 8.0 MGR(MySQL Group Replication)一主两从高可用集群

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《MySQL技术精粹》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、前言 1、MySQL 8.0 中的高可用方案 2、适用场景 二、环境准备 1、系统环境说明…...

pycharm 新UI 固定菜单栏 pycharm2025 中文版

pycharm 新UI 文件 -> 设置 -> 外观与行为 -> 外观 -> UI选项 -> 主菜单:显示在主工具栏上方. 即可固定...

跟单业务和量化交易业务所涉及到的设计模式

&#x1f501; 跟单业务中常用的设计模式&#xff1a; 1. 观察者模式&#xff08;Observer&#xff09; 场景&#xff1a;一个大V下单&#xff0c;系统需要自动通知所有跟随者进行同步下单。好处&#xff1a;解耦下单者与跟随者&#xff0c;支持灵活扩展、异步通知。面试亮点…...

我的世界Java版1.21.4的Fabric模组开发教程(十一)创建方块

这是适用于Minecraft Java版1.21.4的Fabric模组开发系列教程专栏第十一章——创建方块。想要阅读其他内容&#xff0c;请查看或订阅上面的专栏。 方块(Block) 是构成Minecraft世界的主要组成部分&#xff0c;是组成游戏地图的最基本单元&#xff0c;也是模组开发的核心元素之一…...

VR/AR 视网膜级显示破局:10000PPI 如何终结颗粒感时代?

一、传统液晶 “纱窗效应”&#xff1a;VR 沉浸体验的最大绊脚石 当用户首次戴上 VR 头显时&#xff0c;眼前密密麻麻的像素网格往往打破沉浸感 —— 这正是传统液晶显示在近眼场景下的致命缺陷。受限于 500-600PPI 的像素密度&#xff0c;即使达到 4K 分辨率&#xff0c;等效到…...

C++ 命令模式:设计与实现详解

一、引言 在软件开发中,我们经常需要将“请求”或“操作”封装成对象,以便在不同的上下文环境中传递、存储、延迟执行或撤销。命令模式(Command Pattern)正是为解决这类问题而生的行为设计模式。本文将深入探讨 C++ 中命令模式的设计理念、实现方式及其应用场景。 二、命…...

系统思考:化繁为简的艺术

系统思考&#xff0c;其实是一门化繁为简的艺术。当我们能够把复杂的问题拆解成清晰的核心以及更加简单&#xff0c;从而提升团队的思考品质和行动品质&#xff0c;发挥最大的合力。 每个公司都想在某方面成为最优秀的&#xff0c;但是实际上具有穿透性的洞察力和摆脱虚荣心的清…...

java/mysql/ES下的日期类型分析

mysql的timestamp和datetime mysql的TIMESTAMP类型内部存的是unix时间戳&#xff0c;可认为是一个32位的整型&#xff0c;它记录了1970.1.1以来的秒数。因为存储长度4字节的限制&#xff0c;所以有2038年限制。 DATETIME类型内部存的是long型&#xff0c;记录了1000.1.1以来的…...

Angularjs-Hello

1 关于Angularjs 最近因为项目需要又要做这个&#xff0c;所以简单复习下。其实这个大概7&#xff0c;8年前就用过&#xff0c;当时做了几个简单页面觉得太简单就还是回去做嵌入式了。按照互联网技术的进化速度&#xff0c;本来以为早死在 沙滩上了&#xff0c;没想到现在还在坚…...

Python训练营---Day41

DAY 41 简单CNN 知识回顾 数据增强卷积神经网络定义的写法batch归一化&#xff1a;调整一个批次的分布&#xff0c;常用与图像数据特征图&#xff1a;只有卷积操作输出的才叫特征图调度器&#xff1a;直接修改基础学习率 卷积操作常见流程如下&#xff1a; 1. 输入 → 卷积层 …...

Linux 1.0.4

父子shell linux研究的就是shell 打开两个窗口就是两个shell 终端的软件有很多 bash也是一个软件 我们在terminal里面再打开一个bash&#xff0c;然后再次使用ps命令发现多出来一个bash&#xff0c;之后点击exit只是显示了一个exit&#xff0c;这个只是退出了在terminal中打开…...

Qt -下载Qt6与OpenCV

博客主页&#xff1a;【夜泉_ly】 本文专栏&#xff1a;【暂无】 欢迎点赞&#x1f44d;收藏⭐关注❤️ 前言 呃啊&#xff0c;本来就想在 Qt 里简单几个 OpenVC 的函数&#xff0c;没想到一搞就是一天。 我之前的开发环境是 Qt 5.14.2&#xff0c;使用 MinGW 7.3.0 64-bit 编…...

机器学习无监督学习sklearn实战一:K-Means 算法聚类对葡萄酒数据集进行聚类分析和可视化( 主成分分析PCA特征降维)

本项目代码在个人github链接&#xff1a;https://github.com/KLWU07/Machine-learning-Project-practice/tree/main/1-Wine%20cluster%20analysis 如果对于聚类算法理论不理解可参考这篇之前文章机器学习中无监督学习方法的聚类&#xff1a;划分式聚类、层次聚类、密度聚类&…...

可灵2.1 vs Veo 3:AI视频生成谁更胜一筹?

在Google发布Veo 3几天后,可灵显然感受到了压力,发布了即将推出的视频模型系列可灵 2.1的早期体验版。 据我了解,有三种不同的模式: 可灵 2.1 标准模式: 720p分辨率 仅支持图像转视频(生成更快,一致性更好) 5秒视频仍需20积分 可灵 2.1 专业模式: 1080p分辨率 仅在图…...

C语言之编译器集合

C语言有多种不同的编译器&#xff0c;以下是常见的编译工具及其特点&#xff1a; 一、主流C语言编译器 GCC&#xff08;GNU Compiler Collection&#xff09; 特点&#xff1a;开源、跨平台&#xff0c;支持多种语言&#xff08;C、C、Fortran 等&#xff09;。 使用场景&…...

计量表计的演进历程与技术变革:从机械到物联网时代

前言 近期在用python写一些关于计量表计数据集采模型。主要就是针对计量表计采集的相关数据&#xff0c;按照通讯协议格式进行解析&#xff0c;最后根据自己需求&#xff0c;编制界面进行数据的展示&#xff0c;存储&#xff0c;以及运算的内容。现在就个人关于计量表计的一点…...

更换Homebrew 源

以下是查看和修改 Homebrew 源的详细步骤&#xff0c;适用于需要切换到国内镜像以加速下载的场景&#xff1a; 1. 查看当前 Homebrew 源 # 查看 brew 主仓库地址 git -C "$(brew --repo)" remote get-url origin# 查看 homebrew-core 仓库地址 git -C "$(brew…...

人工智能在智能供应链中的创新应用与未来趋势

随着全球化的加速和市场竞争的加剧&#xff0c;供应链管理的复杂性和重要性日益凸显。传统的供应链管理面临着诸多挑战&#xff0c;如需求预测不准确、库存管理效率低下、物流配送延迟等。智能供应链通过引入人工智能&#xff08;AI&#xff09;、物联网&#xff08;IoT&#x…...

鸿蒙OSUniApp自定义手势识别与操作控制实践#三方框架 #Uniapp

UniApp自定义手势识别与操作控制实践 引言 在移动应用开发中&#xff0c;手势交互已经成为提升用户体验的重要组成部分。本文将深入探讨如何在UniApp框架中实现自定义手势识别与操作控制&#xff0c;通过实际案例帮助开发者掌握这一关键技术。我们将以一个图片查看器为例&…...

LLM优化技术——Paged Attention

在Transformer decoding的过程中&#xff0c;需要存储过去tokens的所有Keys和Values&#xff0c;以完成self attention的计算&#xff0c;称之为KV cache。 &#xff08;1&#xff09;KV cache的大小 可以计算存储KV cache所需的内存大小&#xff1a; batch * layers * kv-he…...

推荐几个不错的AI入门学习视频

引言&#xff1a;昨天推荐了几本AI入门书&#xff08;AI入门书&#xff09;&#xff0c;反响还不错。今天&#xff0c;我再推荐几个不错的AI学习视频&#xff0c;希望对大家有帮助。 网上关于AI的学习视频特别多。有收费的&#xff0c;也有免费的。我今天只推荐免费的。 我们按…...

采用Bright Data+n8n+AI打造自动化新闻助手:每天5分钟实现内容日更

一、引言 在信息爆炸的时代&#xff0c;作为科技领域的内容创作者&#xff0c;我每天都要花费2-3小时手动收集行业新闻、撰写摘要并发布到各个社群。直到我发现Bright Datan8nAI这套"黄金组合"&#xff0c;才真正实现了从"人工搬运"到"智能自动化&qu…...

Real SQL Programming

目录 SQL in Real Programs Options Stored Procedures Advantages of Stored Procedures Parameters in PSM SQL in Real Programs We have seen only how SQL is used at the generic query interface --- an environment where we sit at a terminal and ask queries …...