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

JavaScript性能优化实战(14):跨端JavaScript性能优化

在当今多端开发的时代,JavaScript已经突破了浏览器的界限,广泛应用于移动应用、桌面应用、小程序等各类环境。然而,不同平台的运行时环境存在差异,为JavaScript性能优化带来了新的挑战和思考维度。

目录

  1. React Native性能优化最佳实践
  2. Electron应用性能优化策略
  3. 混合应用中JavaScript与原生代码的性能平衡
  4. 小程序环境中的性能优化技巧
  5. Flutter与JavaScript性能对比与互补
  6. 多端统一框架中的性能优化方案

React Native性能优化最佳实践

React Native通过将JavaScript代码转换为原生组件,提供了接近原生的用户体验和开发效率。然而,由于其特殊的架构,性能优化需要同时关注JavaScript引擎性能和原生桥接开销。

1. 架构认知与性能模型

React Native的应用性能主要受三个关键线程影响:

┌─────────────────┐      ┌─────────────────┐      ┌─────────────────┐
│   JS线程        │      │   主线程         │      │   UI线程        │
│                 │      │                 │      │                 │
│ • React渲染     │──┬──>│ • 原生模块调用   │──┬──>│ • 渲染UI组件    │
│ • 业务逻辑      │  │   │ • 桥接通信       │  │   │ • 处理触摸事件  │
│ • 事件处理      │<─┘   │ • 布局计算       │<─┘   │                 │
└─────────────────┘      └─────────────────┘      └─────────────────┘

常见性能问题及解决方案:

  1. JS线程瓶颈

    • 现象:应用卡顿、动画掉帧
    • 原因:复杂计算阻塞线程
    • 解决方案:任务拆分、使用InteractionManager
  2. 桥接通信开销

    • 现象:大量数据传输缓慢
    • 原因:JS与原生通信需要序列化/反序列化
    • 解决方案:减少通信频率、使用Turbo Modules
  3. 内存占用过高

    • 现象:应用崩溃、后台被杀
    • 原因:过多的视图渲染、内存泄漏
    • 解决方案:回收不可见组件、使用FlatList

2. 组件渲染优化策略

React Native的渲染性能直接影响用户体验,优化组件渲染是提升性能的关键。

2.1 精细化使用memo与PureComponent
// 不优化的组件
const UserProfile = (props) => {// 每次父组件渲染都会重新渲染return (<View><Text>{props.name}</Text><Text>{props.email}</Text></View>);
};// 优化后的组件
const UserProfile = React.memo((props) => {// 只有当props发生变化时才会重新渲染return (<View><Text>{props.name}</Text><Text>{props.email}</Text></View>);
}, (prevProps, nextProps) => {// 自定义比较逻辑,返回true表示不需要重新渲染return prevProps.name === nextProps.name && prevProps.email === nextProps.email;
});
2.2 大列表渲染优化

使用专用组件处理大量数据:

// 低效的列表实现
const UserList = ({ users }) => (<ScrollView>{users.map(user => (<UserItem key={user.id} user={user} />))}</ScrollView>
);// 优化的列表实现
const UserList = ({ users }) => (<FlatListdata={users}renderItem={({ item }) => <UserItem user={item} />}keyExtractor={item => item.id}initialNumToRender={10}         // 初始渲染的条数maxToRenderPerBatch={5}         // 每批次渲染的最大数量windowSize={5}                  // 可视区域外的缓冲区大小removeClippedSubviews={true}    // 移除屏幕外的视图getItemLayout={(data, index) => ({  // 预先计算item尺寸length: 80,offset: 80 * index,index,})}/>
);
2.3 避免不必要的重新渲染
  • 避免内联函数和对象:它们在每次渲染时都会创建新的引用
// 不好的做法
const Component = () => (<Button onPress={() => console.log('Pressed')}  // 每次渲染创建新函数style={{ padding: 10 }}                 // 每次渲染创建新对象/>
);// 良好的做法
const Component = () => {const handlePress = useCallback(() => {console.log('Pressed');}, []);const buttonStyle = useMemo(() => ({ padding: 10 }), []);return <Button onPress={handlePress} style={buttonStyle} />;
};

3. 新架构优化:Fabric与Turbo Modules

React Native的新架构引入了两项关键技术,大幅提升了性能:

3.1 Fabric:新UI管理器

Fabric采用了共享持久化C++对象模型,带来以下优势:

  • 直接在C++中执行布局计算
  • 支持优先级调度和并发渲染
  • 减少JS和原生之间的序列化开销

迁移到Fabric的关键步骤:

// 1. 确保组件使用现代API
import { useAnimatedStyle, useSharedValue } from 'react-native-reanimated';function AnimatedComponent() {// 共享值在JS和UI线程间高效同步const offset = useSharedValue(0);// 定义动画样式const animatedStyles = useAnimatedStyle(() => {return {transform: [{ translateX: offset.value }],};});return (<Animated.View style={animatedStyles}>{/* 组件内容 */}</Animated.View>);
}// 2. 避免直接操作原生视图
// 不推荐 - 直接引用原生视图
const viewRef = useRef();
viewRef.current.measure((x, y, width, height) => {// 测量逻辑
});// 推荐 - 使用布局动画
const onLayout = (event) => {const { width, height } = event.nativeEvent.layout;// 处理布局变化
};
3.2 Turbo Modules:高性能原生模块

Turbo Modules提供了直接的JavaScript到C++通信通道,取代传统JSI桥接方式:

  • 延迟加载原生模块,减少启动时间
  • 同步API调用,无需等待桥接队列
  • 类型安全的接口定义

性能对比:

操作类型传统架构新架构 (Turbo)性能提升
简单调用~4.5ms~0.04ms~112x
传输10KB~12ms~0.3ms~40x
传输1MB~850ms~25ms~34x

4. 状态管理与数据流优化

React Native中的状态管理对性能有重大影响,特别是在复杂应用中:

4.1 精细化使用Context API
// 低效的Context使用
const AppContext = React.createContext();const AppProvider = ({ children }) => {const [user, setUser] = useState(null);const [theme, setTheme] = useState('light');const [notifications, setNotifications] = useState([]);// 所有状态放在一个Context中const value = { user, setUser, theme, setTheme, notifications, setNotifications };return (<AppContext.Provider value={value}>{children}</AppContext.Provider>);
};// 优化的Context使用:拆分Context
const UserContext = React.createContext();
const ThemeContext = React.createContext();
const NotificationContext = React.createContext();const AppProvider = ({ children }) => {const [user, setUser] = useState(null);const [theme, setTheme] = useState('light');const [notifications, setNotifications] = useState([]);return (<UserContext.Provider value={{ user, setUser }}><ThemeContext.Provider value={{ theme, setTheme }}><NotificationContext.Provider value={{ notifications, setNotifications }}>{children}</NotificationContext.Provider></ThemeContext.Provider></UserContext.Provider>);
};
4.2 Recoil/Jotai等原子化状态管理

使用原子化状态管理可以精细控制组件重新渲染:

// 使用Recoil进行原子化状态管理
import { atom, selector, useRecoilState, useRecoilValue } from 'recoil';// 定义原子状态
const userAtom = atom({key: 'userState',default: null,
});const cartItemsAtom = atom({key: 'cartItems',default: [],
});// 派生状态
const cartTotalSelector = selector({key: 'cartTotal',get: ({get}) => {const items = get(cartItemsAtom);return items.reduce((sum, item) => sum + item.price * item.quantity, 0);},
});// 在组件中使用
function CartSummary() {// 只有cartTotal变化时才会重新渲染const total = useRecoilValue(cartTotalSelector);return <Text>总价: ¥{total}</Text>;
}function CartItem({ id }) {// 只有特定item变化时才会重新渲染const [items, setItems] = useRecoilState(cartItemsAtom);const item = items.find(item => item.id === id);const updateQuantity = (newQuantity) => {setItems(items.map(i => i.id === id ? {...i, quantity: newQuantity} : i));};return (/* 商品显示UI */);
}

5. 网络与数据处理优化

React Native应用常需处理大量网络请求和数据,优化这些操作对性能至关重要:

5.1 优化API调用策略
// 缓存与防抖结合的API调用
import { useMemo } from 'react';
import { useQuery, QueryClient, QueryClientProvider } from 'react-query';
import debounce from 'lodash/debounce';// 创建查询客户端
const queryClient = new QueryClient({defaultOptions: {queries: {staleTime: 5 * 60 * 1000,  // 数据5分钟内视为新鲜cacheTime: 30 * 60 * 1000, // 缓存保留30分钟retry: 2,                  // 失败时重试2次},},
});// 应用入口组件
function App() {return (<QueryClientProvider client={queryClient}><MainApp /></QueryClientProvider>);
}// 搜索组件
function SearchScreen() {const [query, setQuery] = useState('');// 防抖处理搜索const debouncedSearch = useMemo(() => debounce(term => setQuery(term), 300),[]);// 使用react-query进行数据获取和缓存const { data, isLoading, error } = useQuery(['search', query],() => fetchSearchResults(query),{enabled: query.length > 2, // 只在输入3个字符后才执行keepPreviousData: true,    // 显示上一次数据直到新数据加载完成});return (/* 搜索界面UI */);
}
5.2 JSON解析优化

大型JSON处理在React Native中可能成为性能瓶颈:

// 传统JSON解析
const handleResponse = async (response) => {const jsonText = await response.text();const data = JSON.parse(jsonText); // 可能阻塞JS线程processData(data);
};// 优化方法1: 流式处理大型JSON
import { parse } from 'react-native-stream-json';const handleLargeResponse = async (response) => {const jsonStream = response.body;// 流式处理JSONparse(jsonStream).on('data', data => {// 按需处理数据片段addDataChunk(data);}).on('error', error => {console.error(error);}).on('end', () => {// 所有数据处理完成finalizeData();});
};// 优化方法2: 使用原生JSON解析
import JSONFromNative from 'react-native-json-from-native';const handleResponseWithNative = async (response) => {const jsonText = await response.text();// 在原生层解析JSON,减轻JS线程负担JSONFromNative.parse(jsonText, (error, result) => {if (error) {console.error(error);return;}processData(result);});
};

6. 性能监控与分析工具

持续监控和分析是React Native性能优化的关键环节:

6.1 监控核心指标
// 监控关键性能指标
import { PerformanceObserver } from 'react-native-performance';// 监控JS线程性能
const jsPerformanceObserver = new PerformanceObserver((list) => {const entries = list.getEntries();entries.forEach(entry => {// 记录长任务if (entry.duration > 50) { // 超过50ms的任务可能导致卡顿console.warn(`Long task detected: ${entry.name}, duration: ${entry.duration}ms`);// 上报到性能监控系统reportPerformanceIssue({type: 'long_task',name: entry.name,duration: entry.duration,timestamp: entry.startTime});}});
});// 开始监控
jsPerformanceObserver.observe({ entryTypes: ['longtask'] });// 应用启动时间监控
import { InteractionManager } from 'react-native';const startTime = Date.now();InteractionManager.runAfterInteractions(() => {const ttid = Date.now() - startTime; // Time To Interactive Displayconsole.log(`应用可交互时间: ${ttid}ms`);// 上报指标reportMetric('ttid', ttid);
});
6.2 使用Flipper进行分析
// 在开发环境启用Flipper性能插件
if (__DEV__) {const { connectToDevTools } = require('react-devtools-core');connectToDevTools({host: 'localhost',port: 8097,});// 自定义性能日志global.LOG_PERF = (label, startTime) => {const duration = Date.now() - startTime;console.log(`[性能日志] ${label}: ${duration}ms`);};
}// 在关键组件中使用
function ComplexComponent() {useEffect(() => {const startTime = Date.now();// 昂贵的操作processLargeData();if (__DEV__) {global.LOG_PERF('ComplexComponent初始化', startTime);}}, []);return (/* 组件UI */);
}

7. 实战案例分析:电商应用优化

某电商React Native应用通过综合优化提升了性能指标:

优化前问题:

  • 首屏加载时间超过3秒
  • 商品列表滚动卡顿
  • 详情页图片加载导致UI冻结
  • 结账流程跳转延迟明显

优化策略与效果:

优化措施实施方法性能提升
启动优化异步初始化、延迟非关键模块加载启动时间减少40%
列表渲染使用FlatList、正确配置windowSize和maxToRenderPerBatch滚动提升60fps
详情页图片实现图片预加载、渐进式加载图片阻塞时间减少85%
结账流程优化表单输入防抖、状态本地化页面跳转卡顿降低70%

关键代码片段:

// 优化前:加载所有商品
useEffect(() => {fetchAllProducts().then(setProducts);
}, []);// 优化后:分页加载+预加载
const [products, setProducts] = useState([]);
const [page, setPage] = useState(1);
const [loading, setLoading] = useState(false);// 初始加载
useEffect(() => {loadProducts(1);
}, []);// 加载指定页
const loadProducts = async (pageNum) => {setLoading(true);try {const newProducts = await fetchProducts(pageNum, 20);if (pageNum === 1) {setProducts(newProducts);} else {setProducts(prev => [...prev, ...newProducts]);}setPage(pageNum);// 预加载下一页数据prefetchNextPage(pageNum + 1);} catch (error) {console.error('Failed to load products', error);} finally {setLoading(false);}
};// 预加载下一页
const prefetchNextPage = (nextPage) => {InteractionManager.runAfterInteractions(() => {fetchProducts(nextPage, 20);});
};// 优化的FlatList实现
<FlatListdata={products}renderItem={renderProduct}keyExtractor={item => item.id.toString()}onEndReached={() => loadProducts(page + 1)}onEndReachedThreshold={0.3}initialNumToRender={10}maxToRenderPerBatch={8}windowSize={7}removeClippedSubviews={Platform.OS === 'android'}ListFooterComponent={loading ? <LoadingIndicator /> : null}getItemLayout={(data, index) => ({length: ITEM_HEIGHT,offset: ITEM_HEIGHT * index,index,})}
/>

Electron应用性能优化策略

Electron应用将Chromium与Node.js结合,允许开发者使用Web技术构建跨平台桌面应用。然而,这种便利性也带来了性能挑战,尤其是在资源消耗和启动时间方面。

1. Electron架构与性能特性

Electron应用基于多进程架构,包含主进程(Main)和渲染进程(Renderer):

┌─────────────────────────────────────────────────────┐
│                    Electron应用                      │
│                                                     │
│  ┌─────────────┐         ┌─────────────────────┐    │
│  │  主进程      │         │     渲染进程         │    │
│  │ (Main)      │         │    (Renderer)       │    │
│  │             │         │                     │    │
│  │ • Node.js   │<────────│ • Chromium          │    │
│  │ • 系统访问   │   IPC   │ • Web页面           │    │
│  │ • 进程管理   │────────>│ • DOM操作           │    │
│  └─────────────┘         └─────────────────────┘    │
│                                                     │
└─────────────────────────────────────────────────────┘

性能挑战点:

  1. 内存占用高:每个渲染进程都包含一个Chromium实例
  2. 启动时间长:需要初始化Chromium和Node.js环境
  3. IPC通信开销:主进程与渲染进程间通信需要序列化
  4. 包体积大:默认包含完整的Chromium和Node.js

2. 优化Electron应用启动时间

启动时间是用户体验的第一印象,优化启动速度至关重要。

2.1 懒加载与延迟初始化
// main.js// 不好的做法:启动时加载所有模块
const { app, BrowserWindow, Menu, dialog, globalShortcut } = require('electron');
const fs = require('fs');
const path = require('path');
const { checkForUpdates } = require('./updater');// 好的做法:按需加载模块
const { app, BrowserWindow } = require('electron');let mainWindow;async function createWindow() {mainWindow = new BrowserWindow({width: 1200,height: 800,show: false, // 初始不显示窗口webPreferences: {preload: path.join(__dirname, 'preload.js'),nodeIntegration: false,contextIsolation: true}});// 加载应用await mainWindow.loadFile('index.html');// 显示窗口,减少白屏时间mainWindow.show();// 延迟非关键功能初始化setTimeout(() => {// 仅在需要时加载const { Menu } = require('electron');const menuTemplate = require('./menu');Menu.setApplicationMenu(Menu.buildFromTemplate(menuTemplate));// 注册全局快捷键registerShortcuts();// 检查更新(非阻塞)checkForUpdates();}, 2000);
}// 分离快捷键注册逻辑
function registerShortcuts() {const { globalShortcut } = require('electron');globalShortcut.register('CommandOrControl+F', () => {if (mainWindow) mainWindow.webContents.send('toggle-search');});
}// 仅在ready后创建窗口
app.whenReady().then(createWindow);
2.2 预加载脚本优化
// preload.js - 优化预加载脚本// 不好的做法:在预加载脚本中执行大量同步操作
const { ipcRenderer } = require('electron');
const fs = require('fs');
const userDataPath = '...';
const userData = JSON.parse(fs.readFileSync(userDataPath, 'utf8')); // 阻塞操作// 好的做法:保持预加载脚本简洁
const { contextBridge, ipcRenderer } = require('electron');// 仅暴露必要的API
contextBridge.exposeInMainWorld('electron', {// 简单、轻量的API桥接sendMessage: (channel, data) => {// 白名单通道const validChannels = ['toMain', 'saveData', 'loadData'];if (validChannels.includes(channel)) {ipcRenderer.send(channel, data);}},receive: (channel, func) => {const validChannels = ['fromMain', 'dataUpdated'];if (validChannels.includes(channel)) {// 删除旧监听器以避免内存泄漏ipcRenderer.removeAllListeners(channel);// 添加新监听器ipcRenderer.on(channel, (_, ...args) => func(...args));}}
});// 数据加载放在渲染进程中异步处理,而不是在预加载中同步加载
2.3 窗口创建策略
// 启动优化:使用BrowserWindow构造函数选项
function createOptimizedWindow() {const win = new BrowserWindow({width: 1200,height: 800,show: false,  // 初始隐藏窗口backgroundColor: '#2e2c29', // 设置背景色减少白闪webPreferences: {// 优化预加载preload: path.join(__dirname, 'preload.js'),// 安全设置nodeIntegration: false,contextIsolation: true,// 性能优化backgroundThrottling: false, // 防止后台限流// 渲染进程优化enableRemoteModule: false, // 禁用remote模块减少开销}});// 优化窗口加载策略win.once('ready-to-show', () => {win.show();// 在UI可见后延迟执行非关键初始化setTimeout(() => {// 初始化插件、扩展功能等}, 500);});return win;
}// 窗口恢复策略(提高二次启动速度)
function restoreWindowState(win) {try {const windowStateKeeper = require('electron-window-state');const mainWindowState = windowStateKeeper({defaultWidth: 1200,defaultHeight: 800});// 应用保存的窗口状态win.setPosition(mainWindowState.x, mainWindowState.y);win.setSize(mainWindowState.width, mainWindowState.height);if (mainWindowState.isMaximized) win.maximize();// 监听窗口变化以便保存mainWindowState.manage(win);} catch (e) {console.error('恢复窗口状态失败', e);// 使用默认窗口设置}
}

3. 主进程优化策略

主进程(Main Process)是Electron应用的核心,负责管理窗口、系统API调用和协调渲染进程。

3.1 避免主进程阻塞
// main.js// 不好的做法:在主进程中执行CPU密集型任务
ipcMain.on('process-data', (event, data) => {const result = processMassiveData(data); // 阻塞主进程event.reply('process-result', result);
});// 好的做法:使用工作线程处理密集型计算
const { Worker } = require('worker_threads');ipcMain.on('process-data', (event, data) => {const worker = new Worker('./workers/dataProcessor.js');worker.on('message', (result) => {event.reply('process-result', result);worker.terminate();});worker.on('error', (err) => {console.error(err);event.reply('process-error', err.message);worker.terminate();});worker.postMessage(data);
});// workers/dataProcessor.js
const { parentPort } = require('worker_threads');parentPort.on('message', (data) => {// 执行CPU密集型任务const result = processMassiveData(data);parentPort.postMessage(result);
});function processMassiveData(data) {// 复杂计算逻辑...return processedData;
}
3.2 优化IPC通信
// IPC通信优化// 不佳实践:频繁小数据传输
// 渲染进程
for (let i = 0; i < 1000; i++) {window.electron.sendMessage('update-data', { id: i, value: data[i] });
}// 主进程
ipcMain.on('update-data', (event, item) => {updateDatabase(item);
});// 优化实践:批量传输
// 渲染进程
const batchSize = 50;
for (let i = 0; i < data.length; i += batchSize) {const batch = data.slice(i, i + batchSize);window.electron.sendMessage('update-data-batch', batch);
}// 主进程
ipcMain.on('update-data-batch', (event, items) => {// 批量处理updateDatabaseBatch(items);
});// 进一步优化:使用共享内存通信大数据
// main.js
const { app, BrowserWindow, ipcMain } = require('electron');
const nodeSharedMem = require('node-shared-mem');const sharedBuffer = nodeSharedMem.create('my-app-data', 1024 * 1024); // 1MB共享内存ipcMain.on('get-shared-buffer-info', (event) => {event.returnValue = {id: 'my-app-data',size: sharedBuffer.size,};
});ipcMain.on('shared-buffer-updated', (event, { offset, length }) => {// 从共享内存读取数据const data = sharedBuffer.read(offset, length);processSharedData(data);
});// preload.js
const nodeSharedMem = require('node-shared-mem');contextBridge.exposeInMainWorld('sharedMemory', {getBufferInfo: () => ipcRenderer.sendSync('get-shared-buffer-info'),writeData: (data) => {const bufferInfo = ipcRenderer.sendSync('get-shared-buffer-info');const sharedBuffer = nodeSharedMem.open(bufferInfo.id);// 将数据写入共享内存sharedBuffer.write(0, data);// 通知主进程数据已更新ipcRenderer.send('shared-buffer-updated', { offset: 0, length: data.length });}
});
3.3 应用打包与减少体积
// electron-builder配置优化 (electron-builder.yml)
appId: "com.example.app"
productName: "My Electron App"
asar: true# 文件过滤,缩小包体积
files:- "!**/*.map"  # 排除源码映射- "!**/*.ts"   # 排除TypeScript源文件- "!**/node_modules/*/{CHANGELOG.md,README.md,README,readme.md,readme}"- "!**/node_modules/*/{test,__tests__,tests,powered-test,example,examples}"- "!**/node_modules/*.d.ts"- "!**/node_modules/.bin"- "!**/*.{iml,o,hprof,orig,pyc,pyo,rbc,swp,csproj,sln,xproj}"- "!.editorconfig"- "!**/._*"- "!**/{.DS_Store,.git,.hg,.svn,CVS,RCS,SCCS,__pycache__,thumbs.db,.gitignore,.gitattributes}"- "!**/{__pycache__,*.py[cod],*$py.class}"- "!**/{.env,.env.*,.venv,venv,ENV,env,*.log}"# 按平台拆分依赖,减少不必要的本地模块
electronDist: "node_modules/electron/dist"
nodeGypRebuild: false
npmRebuild: false# 优化macOS打包
mac:target: - dmg- ziphardenedRuntime: truegatekeeperAssess: falsedarkModeSupport: truecategory: "public.app-category.productivity"# 优化Windows打包
win:target: - nsis- portableartifactName: "${productName}-${version}-${arch}.${ext}"# 使用压缩选项
compression: "maximum"# 配置可执行文件元数据
extraMetadata:main

相关文章:

JavaScript性能优化实战(14):跨端JavaScript性能优化

在当今多端开发的时代,JavaScript已经突破了浏览器的界限,广泛应用于移动应用、桌面应用、小程序等各类环境。然而,不同平台的运行时环境存在差异,为JavaScript性能优化带来了新的挑战和思考维度。 目录 React Native性能优化最佳实践Electron应用性能优化策略混合应用中J…...

多通道经颅直流电刺激器产品及解决方案特色解析

前记 团队在多通道经颅直流电刺激这个技术方向&#xff0c;一路深耕。在服务了不少客户之后&#xff0c;为了方便后续的产品和方案推广。我们弄出来了产品和方案两种形态。标准产品是为了给用户演示以及一些常规的实验使用。方案则是为了满足不同方向的科研用户的需求。这两者相…...

Quasar 使用 Pinia 进行状态管理

官方文档&#xff1a;使用 Pinia 进行状态管理 |Quasar 框架 视频教程&#xff1a;quasar框架store-状态管理库pinia介绍_哔哩哔哩_bilibili 使用 Quasar CLI 创建一个新的store quasar new store date --format jsPinia存储模板详解解 基本结构解析 import { defineStore,…...

计算机网络--第一章(下)

1.计算机网络的分层结构 1.1 分层结构 网络体系结构描述的是&#xff0c;计算机网络有几层&#xff0c;有什么功能&#xff0c;用的什么协议。 水平方向的关系&#xff0c; 协议&#xff0c;说的是对等实体间通信需要遵守的规则。用于约束&#xff0c;这个约束的方向是水平的。…...

Veo 3 可以生成视频,并附带配乐

谷歌最新的视频生成 AI 模型 Veo 3 可以创建与其生成的剪辑相配的音频。 周二&#xff0c;在谷歌 I/O 2025 开发者大会上&#xff0c;谷歌发布了 Veo 3。该公司声称&#xff0c;这款产品可以生成音效、背景噪音&#xff0c;甚至对话&#xff0c;为其制作的视频增添配乐。谷歌表…...

数据结构核心知识总结:从基础到应用

数据结构核心知识总结&#xff1a;从基础到应用 数据结构是计算机科学中组织和存储数据的核心方式&#xff0c;直接影响程序的性能和资源利用率。本文系统梳理常见数据结构及其应用场景&#xff0c;帮助读者构建清晰的知识体系。 一、数据结构基础概念 数据结构是数据元素之间…...

Flannel后端为UDP模式下,分析数据包的发送方式(二)

发往 10.244.2.5 的数据包最终会经过物理网卡 enp0s3&#xff0c;尽管路由表直接指定通过 flannel.1 发出。以下以 Markdown 格式详细解释为什么会经过 enp0s3&#xff0c;结合 Kubernetes 和 Flannel UDP 模式的背景。 问题分析 在 Kubernetes 环境中&#xff0c;使用 Flanne…...

超低延迟音视频直播技术的未来发展与创新

引言 音视频直播技术正在深刻改变着我们的生活和工作方式&#xff0c;尤其是在教育、医疗、安防、娱乐等行业。无论是全球性的体育赛事、远程医疗、在线教育&#xff0c;还是智慧安防、智能家居等应用场景&#xff0c;都离不开音视频技术的支持。为了应对越来越高的需求&#x…...

改写视频生产流程!快手SketchVideo开源:通过线稿精准控制动态分镜的AI视频生成方案

Sketch Video 的核心特点 Sketch Video 通过手绘生成动画的形式&#xff0c;将复杂的信息以简洁、有趣的方式展现出来。其核心特点包括&#xff1a; 超强吸引力 Sketch Video 的手绘风格赋予了视频一种质朴而真实的质感&#xff0c;与常见的精致特效视频形成鲜明对比。这种独…...

Circle宣布Circle Payments Network主网上线

据 Circle 官方消息&#xff0c;Circle Payments Network 主网正式上线。该网络是一个基于区块链的支付协调协议&#xff0c;允许银行和支付服务提供商使用公共区块链上的 USDC 进行实时结算。 Circle Payments Network 支持企业对企业供应商支付、跨境汇款、资金管理、企业定期…...

【RabbitMQ】记录 InvalidDefinitionException: Java 8 date/time type

目录 1. 添加必要依赖 2. 配置全局序列化方案&#xff08;推荐&#xff09; 3. 配置RabbitMQ消息转换器 关键点说明 1. 添加必要依赖 首先确保项目中包含JSR-310支持模块&#xff1a; <dependency><groupId>com.fasterxml.jackson.datatype</groupId>&l…...

linux 学习之位图(bitmap)数据结构

bitmap 可以高效地表示大量的布尔值&#xff0c;并且在许多情况下可以提供快速的位操作。 1 定义 enum device_state{DOWN,DOEN_DONE,MAILBOX_READY,MAILBOX_PENDING,STATE_BUILD };DECLARE_BITMAP(state,STATE_BUILD)&#xff1b;相当于》u32 state[BITS_TO_LONGS(4)] BIT…...

CNN手写数字识别/全套源码+注释可直接运行

数据集选择&#xff1a; MNIST数据集来自美国国家标准与技术研究所, National Institute of Standards and Technology (NIST)。训练集&#xff08;training set&#xff09;由来自250个不同人手写的数字构成&#xff0c;其中50%是高中学生&#xff0c;50%来自人口普查局&…...

基于springboot+vue网页系统的社区义工服务互动平台(源码+论文+讲解+部署+调试+售后)

感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;我会一一回复&#xff0c;希望帮助更多的人。 系统背景 在社会文明程度不断提升、社区治理需求持续深化的大背景下&#xff0c;社区义工服务作为…...

MBSS-T1:基于模型的特定受试者自监督运动校正方法用于鲁棒心脏 T1 mapping|文献速递-深度学习医疗AI最新文献

Title 题目 MBSS-T1: Model-based subject-specific self-supervised motion correction forrobust cardiac T1 mapping MBSS-T1&#xff1a;基于模型的特定受试者自监督运动校正方法用于鲁棒心脏 T1 mapping 01 文献速递介绍 心脏T1定量成像&#xff08;Quantitative Car…...

Google机器学习实践指南(迭代学习机制解析篇)

&#x1f525; Google机器学习(5)-迭代学习机制解析 Google机器学习实战(5)-深入理解模型训练中的迭代优化过程 一、迭代学习概念 ▲ 核心定义&#xff1a; 在训练机器学习模型时&#xff0c;首先对权重和偏差进行初始猜测&#xff0c;然后反复调整这些猜测&#xff0c;直到…...

【时时三省】Python 语言----文件

目录 1,文件打开 2, 文件关闭 3, 文件写入 4, 文件读出 5, 文件定位 6, 文件重命名 7, 复制文件 山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 1,文件打开 file = open(file, mode, buffering, encoding, errors, newline, closefd, opener) 2, 文…...

WPF···

设置启动页 默认最后一个窗口关闭,程序退出,可以设置 修改窗体的icon图标 修改项目exe图标 双击项目名会看到代码 其他 在A窗体点击按钮打开B窗体,在B窗体设置WindowStartupLocation=“CenterOwner” 在A窗体的代码设置 B.Owner = this; B.Show(); B窗体生成在A窗体中间…...

架构图 C4 规范简介

架构图 C4 规范简介 C4&#xff08;Context, Containers, Components, Code&#xff09;是一种用于软件架构可视化的分层建模方法&#xff0c;由 Simon Brown 提出。它通过四个不同层次的抽象来描述软件系统&#xff0c;适用于不同受众&#xff08;如业务人员、架构师、开发人…...

运维Web服务器核心知识与实战指南

一、Web服务器基础概述 &#xff08;一&#xff09;核心定义与功能 Web服务器是互联网的基础设施&#xff0c;负责存储、处理和传输网页内容&#xff0c;通过HTTP/HTTPS协议与客户端交互。其核心功能包括&#xff1a; 请求处理&#xff1a;监听端口&#xff08;默认80/443&a…...

免费建站系统是什么?如何选择免费建站系统?

如今&#xff0c;换互联网成为大家生活中必不可少的一部分。对于普通的个人、一些企业、包括一些事业单位&#xff0c;拥有一个高效实用的网站成为展示、宣传、产品介绍的重要途径。但是对于很多用户来说&#xff0c;对于一些没有建站基础的用户来说&#xff1a;建站是一项高门…...

React---day1

React 它允许我们只需要维护自己的状态&#xff0c;当状态改变时&#xff0c;React可以根据最新的状态去渲染我们的UI界面 开发React必须依赖三个库&#xff1a; eact&#xff1a;包含react所必须的核心代码react-dom&#xff1a;react渲染在不同平台所需要的核心代码babel&…...

赋能智慧党建:远眺科技助力党校可视化系统高效落地

项目背景&#xff1a;智慧党校建设的时代召唤 在数字化浪潮席卷各行各业的今天&#xff0c;传统党校亦面临转型升级的迫切需求。 宁波某地党校&#xff0c;积极响应国家关于推进“智慧党建”的号召&#xff0c;旨在通过引入先进信息技术&#xff0c;打造一个集数据展示、信息…...

解决使用HBuilder X开发时uView组件不生效的问题

1.uni-ui 是一个为 uni-app 开发的 UI 组件库&#xff0c;你可以通过 npm 安装它。 在项目的根目录下打开终端&#xff08;可以通过菜单“工具” > “终端”打开&#xff09;&#xff0c;然后运行以下命令来安装 uni-ui&#xff1a; npm install uview-ui2.安装后&#xff…...

React中 lazy与 Suspense懒加载的组件

MyHead.jsx console.log(MyHead.jsx); function Head() {return <>hello Head</>; } export default Head;懒加载.jsx // 引入 React 的 useState、lazy 和 Suspense API // lazy 用于懒加载组件&#xff0c;Suspense 用于在加载过程中显示 loading 状态 import …...

网络学习-利用reactor实现http请求(六)

一、实现HTTP请求 1、印象里面&#xff0c;总有人说C/C语言不能实现HTTP请求&#xff0c;其实不然。C/C语言完全可以实现HTTP请求。通过对select,poll,epoll等IO多路复用技术的学习以及reactor模式的学习&#xff0c;完全能够实现HTTP请求。 2、webserver 主要解决两个问题 …...

【东枫科技】usrp rfnoc 开发环境搭建

作者 太原市东枫电子科技有限公司 &#xff0c;代理销售 USRP&#xff0c;Nvidia&#xff0c;等产品与技术支持&#xff0c;培训服务。 环境 Ubuntu 20.04 依赖包 sudo apt-get updatesudo apt-get install autoconf automake build-essential ccache cmake cpufrequtils …...

RabbitMQ的其中工作模式介绍以及Java的实现

文章目录 前文一、模式介绍1. 简单模式2. 工作队列模式3. 广播模式4. 路由模式5. 通配符模式6. RPC模式7. 发布确认模式 二、代码实现1、简单模式2、工作队列模式生产者消费者消费者 1消费者 2 3、广播模式 (Fanout Mode)生产者消费者 4、路由模式 (Direct Mode)生产者消费者 5…...

Docker 镜像打包到本地

保存镜像 使用 docker save 命令将镜像保存为一个 tar 文件。命令格式如下&#xff1a; docker save [options] IMAGE [IMAGE...]示例&#xff1a;docker save -o centos.tar centos:latest--output 或 -o&#xff1a;将输出保存到指定的文件中。 加载镜像 如果需要在其他机器…...

5分钟搭建智能看板:衡石科技自助式BI工具使用教程

在数据驱动的时代&#xff0c;业务人员需要快速将数据转化为洞察&#xff0c;而非依赖IT团队排队开发报表。衡石科技HENGSHI SENSE的自助式BI工具&#xff0c;通过零代码配置、模板化设计、智能分析三大核心能力&#xff0c;让任何人都能在5分钟内搭建专业级数据看板。本文将手…...

安卓开发用到的设计模式(1)创建型模式

安卓开发用到的设计模式&#xff08;1&#xff09;创建型模式 文章目录 安卓开发用到的设计模式&#xff08;1&#xff09;创建型模式1. 单例模式&#xff08;Singleton Pattern&#xff09;2. 工厂模式&#xff08;Factory Pattern&#xff09;3. 抽象工厂模式&#xff08;Abs…...

Unity3D序列化机制详解

前言 Unity3D的序列化机制是其编辑器与运行时数据管理的核心&#xff0c;理解其工作原理对高效开发至关重要。以下是关键点总结&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&#xff0c;希望大家可以点击进来一起交流一下开发经验呀&#xff01; 1. 序列化的作…...

[Harmony]自定义导航栏

1.方案一 CustomNavigationBar import { router } from kit.ArkUI; import { DevicesUtil } from ../utils/DevicesUtil; import { common } from kit.AbilityKit;Component export struct CustomNavigationBar {State private navHeight: number 44State parTitle: string …...

LeetCode117_填充每个结点的下一个右侧结点指针Ⅱ

LeetCode117_填充每个结点的下一个右侧结点指针Ⅱ 标签&#xff1a;#树 #深度优先遍历 #广度优先遍历 #链表 #二叉树Ⅰ. 题目Ⅱ. 示例 0. 个人方法 标签&#xff1a;#树 #深度优先遍历 #广度优先遍历 #链表 #二叉树 Ⅰ. 题目 给定一个二叉树&#xff1a; struct Node {int v…...

Qt enabled + geometry 属性(2)

文章目录 enabled属性可用与禁用的概念API接口代码演示 阐述说明1. 先简单描述下要如何演示出上面两个接口的效果&#xff08;思路&#xff09;2. 事先规范按钮对象的命名3. 定义两个按钮对象的槽函数 动图演示效果4. widget.cpp geometry属性预备知识API接口上下左右移动 ta…...

OpenHarmony外设驱动使用 (十),Sensor

OpenHarmony外设驱动使用 &#xff08;十&#xff09; Sensor 概述 功能简介 Sensor驱动模型屏蔽硬件器件差异&#xff0c;为上层Sensor服务系统提供稳定的Sensor基础能力接口&#xff0c;包括Sensor列表查询、Sensor启停、Sensor订阅及取消订阅&#xff0c;Sensor参数配置等…...

(2025小白全踩坑版)【OpenHarmony】移植 3.1 版本系统到 STM32F407ZG开发板

在上stm32课程&#xff0c;有这样一道要求&#xff1a; 参考了大佬的文章之后&#xff0c;发现出现了liteos_m.mk文件找不到的情况&#xff0c;于是只能另寻他路 VSCode 搭建 STM32 开发环境_vscode stm32仿真-CSDN博客 【OpenHarmony】移植 3.1 版本系统到 STM32_openharm…...

【HTML-4】HTML段落标签:构建内容结构的基础

在网页开发中&#xff0c;段落标签<p>是最基础也是最重要的HTML元素之一。这篇博客将深入探讨段落标签的用法、最佳实践以及相关技术细节。 1. 段落标签的基本用法 HTML段落标签用于定义文本段落&#xff0c;浏览器会自动在段落前后添加一定的空白&#xff08;margin&a…...

深度学习+Flask 打包一个AI模型接口并部署上线

🚀 深度学习 + Flask 打包一个 AI 模型接口并部署上线(实战教程) 深度学习模型训练完毕后,我们该如何部署上线让它“动起来”?本篇带你手把手用 Flask 将训练好的 PyTorch 模型封装成 Web 接口,实现一个轻量、可访问的在线 AI 服务。 🧠 一、为什么要部署模型? 训练…...

C++类与对象(二):六个默认构造函数(二)

在上篇提到了构造函数、拷贝构造函数、析构函数&#xff0c;这篇将会分享剩下默认构造函数&#xff1a;赋值运算符重载、运算符重载。当学习了这些构造函数可以实现一个日期类。 目录 运算符重载 赋值运算符重载 前置 后置 运算符重载 函数名字为&#xff1a;关键字operat…...

HarmonyOS NEXT应用开发实战:玩鸿蒙App客户端开发

之前学习android时候&#xff0c;有一个玩android的客户端项目很火&#xff0c;不但能够学习知识&#xff0c;还能够动手实践&#xff0c;激发学习兴趣。这里作者通过一个完整的实战项目—玩鸿蒙客户端App&#xff0c;一块儿深入学习如何在HarmonyOS平台上开发一个功能丰富且完…...

十六、面向对象底层逻辑-BeanPostProcessor接口设计

一、引言&#xff1a;Bean生命周期的精密控制 在Spring容器的Bean实例化过程中&#xff0c;BeanPostProcessor接口是开发者介入对象初始化阶段的核心扩展点。作为Spring框架最强大的扩展机制之一&#xff0c;该接口提供了对Bean实例化过程的原子级控制能力&#xff0c;支撑了A…...

在线免费图片处理工具-传道软件图片工具

在线免费图片处理工具-传道软件图片工具 在线免费图片处理工具&#xff0c;无需注册与登录&#xff0c;用完即走。 官网链接&#xff1a; https://www.chdaoai.com/image.html 功能有&#xff1a; Favicon图标生成&#xff0c;图片颜色拾取器&#xff0c;屏幕颜色拾取&…...

JS进阶学习04

一、深浅拷贝 1.浅拷贝 首先浅拷贝和深拷贝只针对引用类型 浅拷贝&#xff1a;拷贝的是地址 常见方法&#xff1a; 1. 拷贝对象&#xff1a;Object.assgin() / 展开运算符 {...obj} 拷贝对象 2. 拷贝数组&#xff1a;Array.prototype.concat() 或者 [...arr] >如果是简…...

CSS、SCSS 和 SASS 的语法差异

CSS、SCSS 和 SASS 的语法差异 CSS (Cascading Style Sheets) 标准样式表语言&#xff0c;所有浏览器原生支持语法特点&#xff1a; 使用大括号 {} 包裹规则使用分号 ; 结束声明简单的选择器-属性-值结构 .container {width: 100%;margin: 0 auto; }SCSS (Sassy CSS) CSS的…...

ThreadPoolTaskExecutor 和 ThreadPoolExecutor 的使用场景

在Spring Boot项目中&#xff0c;ThreadPoolTaskExecutor 和 ThreadPoolExecutor 的使用场景不同&#xff0c;但大部分开发者会更倾向于用 ThreadPoolTaskExecutor。我来给你拆解清楚&#xff0c;面试时直接甩这个答案&#xff01; 1️⃣ 核心区别 ThreadPoolExecutor&#xf…...

打卡31天

文件的规范拆分和写法 知识点回顾 规范的文件命名 规范的文件夹管理 机器学习项目的拆分 编码格式和类型注解 作业&#xff1a;尝试针对之前的心脏病项目&#xff0c;准备拆分的项目文件&#xff0c;思考下哪些部分可以未来复用。 补充介绍&#xff1a; pyc文件的介绍 知识…...

OBOO鸥柏丨AI数字人触摸屏查询触控人脸识别语音交互一体机上市

OBOO鸥柏丨AI数字人触摸屏查询触控人脸识别语音交互一体机上市分析 OBOO鸥柏品牌推出的AI数字人触摸屏查询触控人脸识别语音交互一体机&#xff0c;是其在智能交互设备领域的又一创新产品。该一体机整合了触摸屏查询、AI人脸识别、AI声源定位语音麦克风&#xff0c;触控交互以…...

基于大模型的闭合性尺桡骨干骨折全方位诊疗研究报告

目录 一、引言 1.1 研究背景与目的 1.2 研究意义 二、大模型技术原理与应用现状 2.1 大模型基本原理 2.2 在医疗领域的应用案例 三、闭合性尺桡骨干骨折概述 3.1 骨折定义与分类 3.2 流行病学特征 3.3 临床症状与诊断方法 四、大模型在术前风险预测中的应用 4.1 数…...

Win11上安装docker

Win11上安装docker 一、安装WSL&#xff08;Windows Subsystem for Linux&#xff09;二、安装docker到D盘三、启动docker四、测试启动容器 一、安装WSL&#xff08;Windows Subsystem for Linux&#xff09; 以管理员身份打开cmd 更新WSL wsl --update3. 安装WSL wsl --ins…...