JavaScript性能优化实战(14):跨端JavaScript性能优化
在当今多端开发的时代,JavaScript已经突破了浏览器的界限,广泛应用于移动应用、桌面应用、小程序等各类环境。然而,不同平台的运行时环境存在差异,为JavaScript性能优化带来了新的挑战和思考维度。
目录
- React Native性能优化最佳实践
- Electron应用性能优化策略
- 混合应用中JavaScript与原生代码的性能平衡
- 小程序环境中的性能优化技巧
- Flutter与JavaScript性能对比与互补
- 多端统一框架中的性能优化方案
React Native性能优化最佳实践
React Native通过将JavaScript代码转换为原生组件,提供了接近原生的用户体验和开发效率。然而,由于其特殊的架构,性能优化需要同时关注JavaScript引擎性能和原生桥接开销。
1. 架构认知与性能模型
React Native的应用性能主要受三个关键线程影响:
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ JS线程 │ │ 主线程 │ │ UI线程 │
│ │ │ │ │ │
│ • React渲染 │──┬──>│ • 原生模块调用 │──┬──>│ • 渲染UI组件 │
│ • 业务逻辑 │ │ │ • 桥接通信 │ │ │ • 处理触摸事件 │
│ • 事件处理 │<─┘ │ • 布局计算 │<─┘ │ │
└─────────────────┘ └─────────────────┘ └─────────────────┘
常见性能问题及解决方案:
-
JS线程瓶颈
- 现象:应用卡顿、动画掉帧
- 原因:复杂计算阻塞线程
- 解决方案:任务拆分、使用InteractionManager
-
桥接通信开销
- 现象:大量数据传输缓慢
- 原因:JS与原生通信需要序列化/反序列化
- 解决方案:减少通信频率、使用Turbo Modules
-
内存占用过高
- 现象:应用崩溃、后台被杀
- 原因:过多的视图渲染、内存泄漏
- 解决方案:回收不可见组件、使用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操作 │ │
│ └─────────────┘ └─────────────────────┘ │
│ │
└─────────────────────────────────────────────────────┘
性能挑战点:
- 内存占用高:每个渲染进程都包含一个Chromium实例
- 启动时间长:需要初始化Chromium和Node.js环境
- IPC通信开销:主进程与渲染进程间通信需要序列化
- 包体积大:默认包含完整的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…...
多通道经颅直流电刺激器产品及解决方案特色解析
前记 团队在多通道经颅直流电刺激这个技术方向,一路深耕。在服务了不少客户之后,为了方便后续的产品和方案推广。我们弄出来了产品和方案两种形态。标准产品是为了给用户演示以及一些常规的实验使用。方案则是为了满足不同方向的科研用户的需求。这两者相…...
Quasar 使用 Pinia 进行状态管理
官方文档:使用 Pinia 进行状态管理 |Quasar 框架 视频教程:quasar框架store-状态管理库pinia介绍_哔哩哔哩_bilibili 使用 Quasar CLI 创建一个新的store quasar new store date --format jsPinia存储模板详解解 基本结构解析 import { defineStore,…...
计算机网络--第一章(下)
1.计算机网络的分层结构 1.1 分层结构 网络体系结构描述的是,计算机网络有几层,有什么功能,用的什么协议。 水平方向的关系, 协议,说的是对等实体间通信需要遵守的规则。用于约束,这个约束的方向是水平的。…...
Veo 3 可以生成视频,并附带配乐
谷歌最新的视频生成 AI 模型 Veo 3 可以创建与其生成的剪辑相配的音频。 周二,在谷歌 I/O 2025 开发者大会上,谷歌发布了 Veo 3。该公司声称,这款产品可以生成音效、背景噪音,甚至对话,为其制作的视频增添配乐。谷歌表…...
数据结构核心知识总结:从基础到应用
数据结构核心知识总结:从基础到应用 数据结构是计算机科学中组织和存储数据的核心方式,直接影响程序的性能和资源利用率。本文系统梳理常见数据结构及其应用场景,帮助读者构建清晰的知识体系。 一、数据结构基础概念 数据结构是数据元素之间…...
Flannel后端为UDP模式下,分析数据包的发送方式(二)
发往 10.244.2.5 的数据包最终会经过物理网卡 enp0s3,尽管路由表直接指定通过 flannel.1 发出。以下以 Markdown 格式详细解释为什么会经过 enp0s3,结合 Kubernetes 和 Flannel UDP 模式的背景。 问题分析 在 Kubernetes 环境中,使用 Flanne…...
超低延迟音视频直播技术的未来发展与创新
引言 音视频直播技术正在深刻改变着我们的生活和工作方式,尤其是在教育、医疗、安防、娱乐等行业。无论是全球性的体育赛事、远程医疗、在线教育,还是智慧安防、智能家居等应用场景,都离不开音视频技术的支持。为了应对越来越高的需求&#x…...
改写视频生产流程!快手SketchVideo开源:通过线稿精准控制动态分镜的AI视频生成方案
Sketch Video 的核心特点 Sketch Video 通过手绘生成动画的形式,将复杂的信息以简洁、有趣的方式展现出来。其核心特点包括: 超强吸引力 Sketch Video 的手绘风格赋予了视频一种质朴而真实的质感,与常见的精致特效视频形成鲜明对比。这种独…...
Circle宣布Circle Payments Network主网上线
据 Circle 官方消息,Circle Payments Network 主网正式上线。该网络是一个基于区块链的支付协调协议,允许银行和支付服务提供商使用公共区块链上的 USDC 进行实时结算。 Circle Payments Network 支持企业对企业供应商支付、跨境汇款、资金管理、企业定期…...
【RabbitMQ】记录 InvalidDefinitionException: Java 8 date/time type
目录 1. 添加必要依赖 2. 配置全局序列化方案(推荐) 3. 配置RabbitMQ消息转换器 关键点说明 1. 添加必要依赖 首先确保项目中包含JSR-310支持模块: <dependency><groupId>com.fasterxml.jackson.datatype</groupId>&l…...
linux 学习之位图(bitmap)数据结构
bitmap 可以高效地表示大量的布尔值,并且在许多情况下可以提供快速的位操作。 1 定义 enum device_state{DOWN,DOEN_DONE,MAILBOX_READY,MAILBOX_PENDING,STATE_BUILD };DECLARE_BITMAP(state,STATE_BUILD);相当于》u32 state[BITS_TO_LONGS(4)] BIT…...
CNN手写数字识别/全套源码+注释可直接运行
数据集选择: MNIST数据集来自美国国家标准与技术研究所, National Institute of Standards and Technology (NIST)。训练集(training set)由来自250个不同人手写的数字构成,其中50%是高中学生,50%来自人口普查局&…...
基于springboot+vue网页系统的社区义工服务互动平台(源码+论文+讲解+部署+调试+售后)
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,我会一一回复,希望帮助更多的人。 系统背景 在社会文明程度不断提升、社区治理需求持续深化的大背景下,社区义工服务作为…...
MBSS-T1:基于模型的特定受试者自监督运动校正方法用于鲁棒心脏 T1 mapping|文献速递-深度学习医疗AI最新文献
Title 题目 MBSS-T1: Model-based subject-specific self-supervised motion correction forrobust cardiac T1 mapping MBSS-T1:基于模型的特定受试者自监督运动校正方法用于鲁棒心脏 T1 mapping 01 文献速递介绍 心脏T1定量成像(Quantitative Car…...
Google机器学习实践指南(迭代学习机制解析篇)
🔥 Google机器学习(5)-迭代学习机制解析 Google机器学习实战(5)-深入理解模型训练中的迭代优化过程 一、迭代学习概念 ▲ 核心定义: 在训练机器学习模型时,首先对权重和偏差进行初始猜测,然后反复调整这些猜测,直到…...
【时时三省】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(Context, Containers, Components, Code)是一种用于软件架构可视化的分层建模方法,由 Simon Brown 提出。它通过四个不同层次的抽象来描述软件系统,适用于不同受众(如业务人员、架构师、开发人…...
运维Web服务器核心知识与实战指南
一、Web服务器基础概述 (一)核心定义与功能 Web服务器是互联网的基础设施,负责存储、处理和传输网页内容,通过HTTP/HTTPS协议与客户端交互。其核心功能包括: 请求处理:监听端口(默认80/443&a…...
免费建站系统是什么?如何选择免费建站系统?
如今,换互联网成为大家生活中必不可少的一部分。对于普通的个人、一些企业、包括一些事业单位,拥有一个高效实用的网站成为展示、宣传、产品介绍的重要途径。但是对于很多用户来说,对于一些没有建站基础的用户来说:建站是一项高门…...
React---day1
React 它允许我们只需要维护自己的状态,当状态改变时,React可以根据最新的状态去渲染我们的UI界面 开发React必须依赖三个库: eact:包含react所必须的核心代码react-dom:react渲染在不同平台所需要的核心代码babel&…...
赋能智慧党建:远眺科技助力党校可视化系统高效落地
项目背景:智慧党校建设的时代召唤 在数字化浪潮席卷各行各业的今天,传统党校亦面临转型升级的迫切需求。 宁波某地党校,积极响应国家关于推进“智慧党建”的号召,旨在通过引入先进信息技术,打造一个集数据展示、信息…...
解决使用HBuilder X开发时uView组件不生效的问题
1.uni-ui 是一个为 uni-app 开发的 UI 组件库,你可以通过 npm 安装它。 在项目的根目录下打开终端(可以通过菜单“工具” > “终端”打开),然后运行以下命令来安装 uni-ui: npm install uview-ui2.安装后ÿ…...
React中 lazy与 Suspense懒加载的组件
MyHead.jsx console.log(MyHead.jsx); function Head() {return <>hello Head</>; } export default Head;懒加载.jsx // 引入 React 的 useState、lazy 和 Suspense API // lazy 用于懒加载组件,Suspense 用于在加载过程中显示 loading 状态 import …...
网络学习-利用reactor实现http请求(六)
一、实现HTTP请求 1、印象里面,总有人说C/C语言不能实现HTTP请求,其实不然。C/C语言完全可以实现HTTP请求。通过对select,poll,epoll等IO多路复用技术的学习以及reactor模式的学习,完全能够实现HTTP请求。 2、webserver 主要解决两个问题 …...
【东枫科技】usrp rfnoc 开发环境搭建
作者 太原市东枫电子科技有限公司 ,代理销售 USRP,Nvidia,等产品与技术支持,培训服务。 环境 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 文件。命令格式如下: docker save [options] IMAGE [IMAGE...]示例:docker save -o centos.tar centos:latest--output 或 -o:将输出保存到指定的文件中。 加载镜像 如果需要在其他机器…...
5分钟搭建智能看板:衡石科技自助式BI工具使用教程
在数据驱动的时代,业务人员需要快速将数据转化为洞察,而非依赖IT团队排队开发报表。衡石科技HENGSHI SENSE的自助式BI工具,通过零代码配置、模板化设计、智能分析三大核心能力,让任何人都能在5分钟内搭建专业级数据看板。本文将手…...
安卓开发用到的设计模式(1)创建型模式
安卓开发用到的设计模式(1)创建型模式 文章目录 安卓开发用到的设计模式(1)创建型模式1. 单例模式(Singleton Pattern)2. 工厂模式(Factory Pattern)3. 抽象工厂模式(Abs…...
Unity3D序列化机制详解
前言 Unity3D的序列化机制是其编辑器与运行时数据管理的核心,理解其工作原理对高效开发至关重要。以下是关键点总结: 对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交流一下开发经验呀! 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_填充每个结点的下一个右侧结点指针Ⅱ 标签:#树 #深度优先遍历 #广度优先遍历 #链表 #二叉树Ⅰ. 题目Ⅱ. 示例 0. 个人方法 标签:#树 #深度优先遍历 #广度优先遍历 #链表 #二叉树 Ⅰ. 题目 给定一个二叉树: struct Node {int v…...
Qt enabled + geometry 属性(2)
文章目录 enabled属性可用与禁用的概念API接口代码演示 阐述说明1. 先简单描述下要如何演示出上面两个接口的效果(思路)2. 事先规范按钮对象的命名3. 定义两个按钮对象的槽函数 动图演示效果4. widget.cpp geometry属性预备知识API接口上下左右移动 ta…...
OpenHarmony外设驱动使用 (十),Sensor
OpenHarmony外设驱动使用 (十) Sensor 概述 功能简介 Sensor驱动模型屏蔽硬件器件差异,为上层Sensor服务系统提供稳定的Sensor基础能力接口,包括Sensor列表查询、Sensor启停、Sensor订阅及取消订阅,Sensor参数配置等…...
(2025小白全踩坑版)【OpenHarmony】移植 3.1 版本系统到 STM32F407ZG开发板
在上stm32课程,有这样一道要求: 参考了大佬的文章之后,发现出现了liteos_m.mk文件找不到的情况,于是只能另寻他路 VSCode 搭建 STM32 开发环境_vscode stm32仿真-CSDN博客 【OpenHarmony】移植 3.1 版本系统到 STM32_openharm…...
【HTML-4】HTML段落标签:构建内容结构的基础
在网页开发中,段落标签<p>是最基础也是最重要的HTML元素之一。这篇博客将深入探讨段落标签的用法、最佳实践以及相关技术细节。 1. 段落标签的基本用法 HTML段落标签用于定义文本段落,浏览器会自动在段落前后添加一定的空白(margin&a…...
深度学习+Flask 打包一个AI模型接口并部署上线
🚀 深度学习 + Flask 打包一个 AI 模型接口并部署上线(实战教程) 深度学习模型训练完毕后,我们该如何部署上线让它“动起来”?本篇带你手把手用 Flask 将训练好的 PyTorch 模型封装成 Web 接口,实现一个轻量、可访问的在线 AI 服务。 🧠 一、为什么要部署模型? 训练…...
C++类与对象(二):六个默认构造函数(二)
在上篇提到了构造函数、拷贝构造函数、析构函数,这篇将会分享剩下默认构造函数:赋值运算符重载、运算符重载。当学习了这些构造函数可以实现一个日期类。 目录 运算符重载 赋值运算符重载 前置 后置 运算符重载 函数名字为:关键字operat…...
HarmonyOS NEXT应用开发实战:玩鸿蒙App客户端开发
之前学习android时候,有一个玩android的客户端项目很火,不但能够学习知识,还能够动手实践,激发学习兴趣。这里作者通过一个完整的实战项目—玩鸿蒙客户端App,一块儿深入学习如何在HarmonyOS平台上开发一个功能丰富且完…...
十六、面向对象底层逻辑-BeanPostProcessor接口设计
一、引言:Bean生命周期的精密控制 在Spring容器的Bean实例化过程中,BeanPostProcessor接口是开发者介入对象初始化阶段的核心扩展点。作为Spring框架最强大的扩展机制之一,该接口提供了对Bean实例化过程的原子级控制能力,支撑了A…...
在线免费图片处理工具-传道软件图片工具
在线免费图片处理工具-传道软件图片工具 在线免费图片处理工具,无需注册与登录,用完即走。 官网链接: https://www.chdaoai.com/image.html 功能有: Favicon图标生成,图片颜色拾取器,屏幕颜色拾取&…...
JS进阶学习04
一、深浅拷贝 1.浅拷贝 首先浅拷贝和深拷贝只针对引用类型 浅拷贝:拷贝的是地址 常见方法: 1. 拷贝对象:Object.assgin() / 展开运算符 {...obj} 拷贝对象 2. 拷贝数组:Array.prototype.concat() 或者 [...arr] >如果是简…...
CSS、SCSS 和 SASS 的语法差异
CSS、SCSS 和 SASS 的语法差异 CSS (Cascading Style Sheets) 标准样式表语言,所有浏览器原生支持语法特点: 使用大括号 {} 包裹规则使用分号 ; 结束声明简单的选择器-属性-值结构 .container {width: 100%;margin: 0 auto; }SCSS (Sassy CSS) CSS的…...
ThreadPoolTaskExecutor 和 ThreadPoolExecutor 的使用场景
在Spring Boot项目中,ThreadPoolTaskExecutor 和 ThreadPoolExecutor 的使用场景不同,但大部分开发者会更倾向于用 ThreadPoolTaskExecutor。我来给你拆解清楚,面试时直接甩这个答案! 1️⃣ 核心区别 ThreadPoolExecutor…...
打卡31天
文件的规范拆分和写法 知识点回顾 规范的文件命名 规范的文件夹管理 机器学习项目的拆分 编码格式和类型注解 作业:尝试针对之前的心脏病项目,准备拆分的项目文件,思考下哪些部分可以未来复用。 补充介绍: pyc文件的介绍 知识…...
OBOO鸥柏丨AI数字人触摸屏查询触控人脸识别语音交互一体机上市
OBOO鸥柏丨AI数字人触摸屏查询触控人脸识别语音交互一体机上市分析 OBOO鸥柏品牌推出的AI数字人触摸屏查询触控人脸识别语音交互一体机,是其在智能交互设备领域的又一创新产品。该一体机整合了触摸屏查询、AI人脸识别、AI声源定位语音麦克风,触控交互以…...
基于大模型的闭合性尺桡骨干骨折全方位诊疗研究报告
目录 一、引言 1.1 研究背景与目的 1.2 研究意义 二、大模型技术原理与应用现状 2.1 大模型基本原理 2.2 在医疗领域的应用案例 三、闭合性尺桡骨干骨折概述 3.1 骨折定义与分类 3.2 流行病学特征 3.3 临床症状与诊断方法 四、大模型在术前风险预测中的应用 4.1 数…...
Win11上安装docker
Win11上安装docker 一、安装WSL(Windows Subsystem for Linux)二、安装docker到D盘三、启动docker四、测试启动容器 一、安装WSL(Windows Subsystem for Linux) 以管理员身份打开cmd 更新WSL wsl --update3. 安装WSL wsl --ins…...