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

JavaScript性能优化实战(11):前沿技术在性能优化中的应用

引言

随着Web应用复杂度和性能需求不断提高,传统的JavaScript优化技术已经无法满足某些高性能计算场景的需求。本文将深入探讨前沿Web技术如何突破JavaScript的性能瓶颈,为Web应用提供接近原生应用的性能体验。从底层计算到图形渲染,从并发处理到动画优化,我们将通过实际案例展示这些技术如何在真实项目中发挥作用。

WebAssembly在计算密集型场景中的应用

WebAssembly (Wasm) 作为一种低级的类汇编语言,为Web平台提供了接近原生性能的执行能力。它能够以接近机器代码的效率运行,特别适合计算密集型任务。

WebAssembly基础与性能特性

WebAssembly的核心性能优势包括:

  1. 编译执行而非解释执行:WebAssembly以二进制格式分发,浏览器可以直接编译成机器码而无需解析和优化。
  2. 静态类型系统:明确的类型信息使编译器可以生成高效代码。
  3. 内存安全:采用沙箱执行模型,内存访问受限于分配的内存区域。
  4. 与JavaScript的高效互操作:可以与JavaScript无缝集成。
// 加载WebAssembly模块的基本流程
async function loadWasmModule(wasmUrl, importObject = {}) {try {// 获取WebAssembly二进制代码const response = await fetch(wasmUrl);const buffer = await response.arrayBuffer();// 编译和实例化WebAssembly模块const wasmModule = await WebAssembly.instantiate(buffer, importObject);// 返回导出的函数和变量return wasmModule.instance.exports;} catch (error) {console.error('加载WebAssembly模块失败:', error);throw error;}
}// 使用示例
async function initWasmCalculator() {const wasmExports = await loadWasmModule('/calculator.wasm');// 调用WebAssembly函数const result = wasmExports.fibonacci(40);console.log('Fibonacci计算结果:', result);return wasmExports;
}

计算密集型场景性能对比

在计算密集型任务中,WebAssembly表现出明显的性能优势:

算法/操作JavaScript执行时间WebAssembly执行时间性能提升
斐波那契数列(n=45)12,450ms980ms12.7倍
图像处理(4K图像模糊)2,800ms230ms12.2倍
物理引擎(1000个物体碰撞)75ms/帧8ms/帧9.4倍
数据加密(AES-256)180ms/MB15ms/MB12倍

WebAssembly实战:图像处理优化

以图像处理为例,我们可以将计算密集的操作从JavaScript迁移到WebAssembly:

// ImageProcessor.js
class ImageProcessor {constructor() {this.wasmReady = false;this.wasmModule = null;this.init();}async init() {try {// 加载WebAssembly模块const importObject = {env: {memory: new WebAssembly.Memory({ initial: 256, maximum: 512 }),abort: () => console.error('WebAssembly内存分配失败')}};this.wasmModule = await loadWasmModule('/image_processor.wasm', importObject);this.wasmReady = true;console.log('WebAssembly图像处理器已准备就绪');} catch (error) {console.error('初始化WebAssembly图像处理器失败:', error);}}// 使用WebAssembly进行高斯模糊处理async applyGaussianBlur(imageData, radius) {if (!this.wasmReady) {await new Promise(resolve => {const checkReady = () => {if (this.wasmReady) {resolve();} else {setTimeout(checkReady, 50);}};checkReady();});}const { width, height, data } = imageData;const size = width * height * 4; // RGBA每像素4字节// 分配内存并复制数据const wasmMemoryOffset = this.wasmModule.allocateMemory(size);const wasmMemory = new Uint8Array(this.wasmModule.memory.buffer, wasmMemoryOffset, size);wasmMemory.set(new Uint8Array(data.buffer));// 调用WebAssembly函数处理图像this.wasmModule.gaussianBlur(wasmMemoryOffset, width, height, radius);// 复制结果回ImageDataconst resultData = new Uint8ClampedArray(wasmMemory.buffer, wasmMemoryOffset, size);const result = new ImageData(resultData, width, height);// 释放WebAssembly内存this.wasmModule.freeMemory(wasmMemoryOffset);return result;}// 使用JavaScript实现的对照组applyGaussianBlurJS(imageData, radius) {// JavaScript实现的高斯模糊(性能较差)const { width, height, data } = imageData;const result = new Uint8ClampedArray(data.length);// ... 高斯模糊的JavaScript实现 ...return new ImageData(result, width, height);}
}// 使用示例
async function processImage() {const processor = new ImageProcessor();const canvas = document.getElementById('sourceCanvas');const ctx = canvas.getContext('2d');const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);console.time('WebAssembly模糊处理');const processedData = await processor.applyGaussianBlur(imageData, 5);console.timeEnd('WebAssembly模糊处理');console.time('JavaScript模糊处理');const jsProcessedData = processor.applyGaussianBlurJS(imageData, 5);console.timeEnd('JavaScript模糊处理');// 显示处理结果const resultCanvas = document.getElementById('resultCanvas');const resultCtx = resultCanvas.getContext('2d');resultCtx.putImageData(processedData, 0, 0);
}

WebAssembly与Rust/C++集成

WebAssembly的真正强大之处在于它可以将其他高性能语言编译到Web环境:

// image_processor.rs (Rust实现)
use wasm_bindgen::prelude::*;#[wasm_bindgen]
pub fn gaussian_blur(data_ptr: *mut u8, width: u32, height: u32, radius: u32) {let buffer_size = (width * height * 4) as usize;let data = unsafe { std::slice::from_raw_parts_mut(data_ptr, buffer_size) };// 实现高斯模糊算法// ...计算高斯核// ...应用卷积
}#[wasm_bindgen]
pub fn allocate_memory(size: usize) -> *mut u8 {// 分配内存let mut buffer = Vec::with_capacity(size);buffer.resize(size, 0);let ptr = buffer.as_mut_ptr();std::mem::forget(buffer); // 防止内存被回收ptr
}#[wasm_bindgen]
pub fn free_memory(ptr: *mut u8, size: usize) {// 释放之前分配的内存unsafe {let _ = Vec::from_raw_parts(ptr, size, size);// Vector超出作用域后会自动释放内存}
}

生成WebAssembly模块:

wasm-pack build --target web

实际应用场景与性能优化策略

WebAssembly在以下场景中表现出色:

  1. 图像和视频处理:滤镜、转码、实时特效
  2. 3D渲染和物理模拟:游戏引擎、AR/VR应用
  3. 科学计算:数据分析、机器学习推理
  4. 加密和安全:端到端加密、区块链操作

优化策略:

  1. 最小化JavaScript与WebAssembly之间的数据传输

    • 使用共享内存而非复制数据
    • 批量处理数据而非频繁调用
  2. 合理分配任务

    • 将计算密集型任务交给WebAssembly
    • 将DOM操作和UI逻辑留给JavaScript
  3. 使用AssemblyScript降低开发门槛

    • 类TypeScript语法,更容易上手
    • 直接编译为WebAssembly
// AssemblyScript示例
export function fibonacci(n: i32): i32 {if (n <= 1) return n;return fibonacci(n - 1) + fibonacci(n - 2);
}export function processArray(array: Int32Array): Int32Array {const length = array.length;const result = new Int32Array(length);for (let i = 0; i < length; i++) {result[i] = array[i] * 2 + 1;}return result;
}

WebAssembly未来发展趋势

WebAssembly正在迅速发展,未来方向包括:

  1. 垃圾回收提案:简化与高级语言的集成
  2. 多线程支持:结合SharedArrayBuffer实现并行计算
  3. SIMD指令集:加速向量化运算
  4. 异常处理机制:改进错误处理流程
  5. 与Web API更深入集成:直接访问DOM、WebGL等API

WebAssembly已经从单纯的性能优化工具,逐渐发展为构建高性能Web应用的重要基础设施。随着工具链的完善和社区的发展,它将在Web性能优化领域发挥越来越重要的作用。

Web Worker多线程架构设计

JavaScript传统上以单线程模型运行,这意味着计算密集型任务会阻塞UI渲染和用户交互。Web Worker提供了在浏览器中实现真正多线程的能力,允许将耗时操作迁移到后台线程,保持主线程的响应性。

Web Worker基础与性能特性

Web Worker的核心特性包括:

  1. 真正的并行计算:Worker在独立线程中运行,不会阻塞主线程
  2. 隔离的执行环境:Worker有自己的全局上下文,独立于主线程
  3. 消息传递通信机制:通过结构化克隆算法传递数据
  4. 有限的API访问:无法直接操作DOM,但可访问部分Web API
// 创建Worker
const myWorker = new Worker('/path/to/worker.js');// 发送消息到Worker
myWorker.postMessage({type: 'PROCESS_DATA',data: largeDataArray
});// 接收Worker的处理结果
myWorker.onmessage = function(e) {const result = e.data;console.log('Worker处理完成,结果:', result);
};// 处理Worker错误
myWorker.onerror = function(error) {console.error('Worker错误:', error.message);
};

Worker脚本(worker.js):

// worker.js
self.onmessage = function(e) {const { type, data } = e.data;if (type === 'PROCESS_DATA') {// 执行耗时操作const result = processLargeData(data);// 将结果发送回主线程self.postMessage(result);}
};function processLargeData(data) {// 耗时计算,不会阻塞主线程// ...处理逻辑return processedData;
}

多线程架构设计模式

工作池模式(Worker Pool)

当需要处理大量并行任务时,维护一个Worker池可以提高资源利用率:

class WorkerPool {constructor(workerScript, numWorkers = navigator.hardwareConcurrency || 4) {this.workerScript = workerScript;this.workers = [];this.queue = [];this.activeWorkers = new Map();// 创建Worker池for (let i = 0; i < numWorkers; i++) {const worker = new Worker(workerScript);worker.onmessage = (e) => {const { jobId, result } = e.data;const { resolve } = this.activeWorkers.get(jobId);this.activeWorkers.delete(jobId);resolve(result);// 处理队列中的下一个任务this.processQueue();};worker.onerror = (error) => {const { jobId } = this.activeWorkers.get(jobId) || {};if (jobId) {const { reject } = this.activeWorkers.get(jobId);this.activeWorkers.delete(jobId);reject(error);}// 替换出错的Workerconst index = this.workers.indexOf(worker);if (index !== -1) {this.workers[index] = new Worker(this.workerScript);}this.processQueue();};this.workers.push(worker);}}processQueue() {if (this.queue.length === 0) return;// 查找空闲Workerconst availableWorkerIndex = this.workers.findIndex(worker => !Array.from(this.activeWorkers.values()).some(job => job.worker === worker));if (availableWorkerIndex !== -1) {const { jobId, payload, resolve, reject } = this.queue.shift();const worker = this.workers[availableWorkerIndex];this.activeWorkers.set(jobId, { worker, resolve, reject });worker.postMessage({ jobId, ...payload });}}exec(payload) {return new Promise((resolve, reject) => {const jobId = `job_${Date.now()}_${Math.random()}`;this.queue.push({ jobId, payload, resolve, reject });this.processQueue();});}terminate() {this.workers.forEach(worker => worker.terminate());this.workers = [];this.queue = [];this.activeWorkers.clear();}
}// 使用示例
const pool = new WorkerPool('worker.js', 4);async function processImages(images) {const results = [];for (const image of images) {const result = await pool.exec({type: 'PROCESS_IMAGE',data: image});results.push(result);}return results;
}

Worker脚本(worker.js):

// worker.js for worker pool
self.onmessage = function(e) {const { jobId, type, data } = e.data;let result;if (type === 'PROCESS_IMAGE') {result = processImage(data);} else if (type === 'ANALYZE_DATA') {result = analyzeData(data);}self.postMessage({ jobId, result });
};
专用Worker模式

对于特定功能或服务,可以创建专用Worker,使其作为应用的基础设施:

// 数据处理Worker
class DataProcessor {constructor() {this.worker = new Worker('/workers/data-processor.js');this.callbacks = new Map();this.requestId = 0;this.worker.onmessage = (e) => {const { id, result, error } = e.data;if (this.callbacks.has(id)) {const { resolve, reject } = this.callbacks.get(id);this.callbacks.delete(id);if (error) {reject(new Error(error));} else {resolve(result);}}};}process(method, params) {return new Promise((resolve, reject) => {const id = this.requestId++;this.callbacks.set(id, { resolve, reject });this.worker.postMessage({ id, method, params });});}async sortData(data, options) {return this.process('sortData', { data, options });}async filterData(data, criteria) {return this.process('filterData', { data, criteria });}async aggregateData(data, groupBy) {return this.process('aggregateData', { data, groupBy });}
}// 使用示例
const processor = new DataProcessor();async function updateDashboard() {const rawData = await fetchData();// 在Worker中处理数据const sortedData = await processor.sortData(rawData, { key: 'timestamp', direction: 'desc' });const filteredData = await processor.filterData(sortedData, { region: 'APAC', status: 'active' });const aggregatedData = await processor.aggregateData(filteredData, 'category');// 在主线程中更新UIrenderCharts(aggregatedData);
}

Worker脚本(data-processor.js):

// data-processor.js
const handlers = {sortData({ data, options }) {const { key, direction } = options;const multiplier = direction === 'desc' ? -1 : 1;return [...data].sort((a, b) => {return multiplier * (a[key] < b[key] ? -1 : a[key] > b[key] ? 1 : 0);});},filterData({ data, criteria }) {return data.filter(item => {return Object.entries(criteria).every(([key, value]) => item[key] === value);});},aggregateData({ data, groupBy }) {return data.reduce((acc, item) => {const key = item[groupBy];if (!acc[key]) {acc[key] = [];}acc[key].push(item);return acc;}, {});}
};self.onmessage = function(e) {const { id, method, params } = e.data;try {if (handlers[method]) {const result = handlers[method](params);self.postMessage({ id, result });} else {throw new Error(`未知方法: ${method}`);}} catch (error) {self.postMessage({ id, error: error.message });}
};

性能优化与数据传输

Web Worker通信存在性能开销,主要与数据传输有关:

1. 结构化克隆开销

当使用postMessage传递数据时,数据会被结构化克隆,这意味着会创建数据的深拷贝:

// 测量传输大型数据的开销
function measureTransferTime(data) {const worker = new Worker('transfer-test.js');return new Promise(resolve => {const start = performance.now();worker.onmessage = () => {const end = performance.now();worker.terminate();resolve(end - start);};worker.postMessage(data);});
}async function compareTransferMethods() {// 创建大型数据(100MB TypedArray)const size = 100 * 1024 * 1024;const largeArray = new Float64Array(size / 8);// 填充随机数据for (let i = 0; i < largeArray.length; i++) {largeArray[i] = Math.random();}console.log(`数据大小: ${size / (1024 * 1024)} MB`);// 常规传输(克隆)const cloneTime = await measureTransferTime(largeArray);console.log(`常规传输时间: ${cloneTime.toFixed(2)}ms`);// 可转移对象(zero-copy)const transferTime = await measureTransferTime({ data: largeArray.buffer,transfer: [largeArray.buffer]});console.log(`可转移对象传输时间: ${transferTime.toFixed(2)}ms`);
}

Worker脚本(transfer-test.js):

// transfer-test.js
self.onmessage = function(e) {// 简单确认接收到数据self.postMessage('received');
};
2. 使用可转移对象(Transferable Objects)

对于ArrayBuffer和MessagePort等可转移对象,可以避免克隆:

// 使用可转移对象优化数据传输
function processLargeImageData(imageData) {return new Promise((resolve, reject) => {const worker = new Worker('image-processor.js');worker.onmessage = (e) => {const { processedBuffer } = e.data;const processedData = new Uint8ClampedArray(processedBuffer);const imageData = new ImageData(processedData, e.data.width, e.data.height);worker.terminate();resolve(imageData);};worker.onerror = (error) => {worker.terminate();reject(error);};// 转移ArrayBuffer所有权worker.postMessage({buffer: imageData.data.buffer,width: imageData.width,height: imageData.height}, [imageData.data.buffer]);// 注意:传输后,原始imageData.data将不再可用});
}

Worker脚本(image-processor.js):

// image-processor.js
self.onmessage = function(e) {const { buffer, width, height } = e.data;const data = new Uint8ClampedArray(buffer);// 进行图像处理...invertColors(data);// 将处理后的buffer传回主线程self.postMessage({processedBuffer: data.buffer,width,height}, [data.buffer]);
};function invertColors(data) {for (let i = 0; i < data.length; i += 4) {data[i] = 255 - data[i];         // Rdata[i + 1] = 255 - data[i + 1]; // Gdata[i + 2] = 255 - data[i + 2]; // B// 保持Alpha通道不变}
}
3. 共享内存优化

使用SharedArrayBuffer允许主线程和Worker线程共享内存,避免数据复制:

// 使用SharedArrayBuffer共享内存
function setupSharedMemoryProcessing() {// 创建一个共享内存缓冲区(4MB)const sharedBuffer = new SharedArrayBuffer(4 * 1024 * 1024);const sharedArray = new Float64Array(sharedBuffer);// 创建Workerconst worker = new Worker('shared-memory-worker.js');// 发送共享内存引用worker.postMessage({ sharedBuffer });return {processData(data) {// 将数据复制到共享内存for (let i = 0; i < data.length; i++) {sharedArray[i] = data[i];}// 通知Worker处理指定范围的数据return new Promise(resolve => {worker.onmessage = (e) => {if (e.data.status === 'DONE') {// 从共享内存读取结果const result = new Float64Array(sharedArray.buffer, 0, data.length);resolve(Array.from(result));}};worker.postMessage({command: 'PROCESS',length: data.length});});},terminate() {worker

相关文章:

JavaScript性能优化实战(11):前沿技术在性能优化中的应用

引言 随着Web应用复杂度和性能需求不断提高,传统的JavaScript优化技术已经无法满足某些高性能计算场景的需求。本文将深入探讨前沿Web技术如何突破JavaScript的性能瓶颈,为Web应用提供接近原生应用的性能体验。从底层计算到图形渲染,从并发处理到动画优化,我们将通过实际案…...

数据结构【AVL树】

AVL树 1.AVL树1.AVL的概念2.平衡因子 2.AVl树的实现2.1AVL树的结构2.2AVL树的插入2.3 旋转2.3.1 旋转的原则 1.AVL树 1.AVL的概念 AVL树可以是一个空树。 它的左右子树都是AVL树&#xff0c;且左右子树的高度差的绝对值不超过1。AVL树是一颗高度平衡搜索二叉树&#xff0c;通…...

电动调节V型球阀:行业应用与材质选择全解析

电动调节V型球阀&#xff1a;行业应用与材质选择全解析 作为工业自动化控制中的关键设备&#xff0c;电动调节V型球阀凭借其独特的结构设计与高性能调节能力&#xff0c;在石油、化工、造纸等高要求领域广泛应用。本文将从核心功能、行业应用场景、材质选择要点等方面深入解析…...

页面上如何显示特殊字符、Unicode字符?

在前端开发中&#xff0c;显示特殊字符通常涉及到HTML实体&#xff08;HTML Entities&#xff09;或 Unicode 字符的使用。以下是一些常见的方法来处理特殊字符的显示&#xff1a; 1、HTML实体&#xff1a; HTML为一些常见的特殊字符提供了预定义的实体。例如&#xff0c;要显…...

桌面端进程通信

以下是关于 Electron 桌面端进程通信的基本知识点总结: 一、Electron 进程模型基础 1. 进程类型与职责 进程类型职责权限主进程(Main)创建窗口、系统级操作、IPC中枢完全Node.js访问权限渲染进程(Renderer)展示Web内容、UI交互默认受限(可配置开启Node.js)预加载脚本(Prelo…...

vue2 切换主题色以及单页面好使方法

今天要新增一个页面要根据不同公司切换不同页面主题色&#xff0c;一点一点来&#xff0c;怎么快速更改 el-pagination 分页组件主题色。 <el-pagination :page-size"pageSize" :pager-count"pageCount"layout"sizes, prev, pager, next, jumper,…...

三层固定实体架构:高效实现图上的检索增强生成(RAG)

知识图谱正在成为跨各个领域组织和检索信息的强大工具。它们越来越多地与机器学习和自然语言处理技术相结合,以增强信息检索和推理能力。在本文中,我介绍了一种用于构建知识图谱的三层架构,结合了固定本体实体、文档片段和提取的命名实体。通过利用嵌入和余弦相似度,这种方…...

pnpm 与 npm 的核心区别

以下是 pnpm 与 npm 的核心区别总结&#xff0c;涵盖依赖管理、性能、安全性等关键维度&#xff1a; 1. 依赖存储机制 • npm&#xff1a; 每个项目的依赖独立存储于 node_modules&#xff0c;即使多个项目使用相同版本的包&#xff0c;也会重复下载和存储。例如&#xff0c;1…...

NVMe简介6之PCIe事务层

PCIe的事务层连接了PCIe设备核心与PCIe链路&#xff0c;这里主要基于PCIe事务层进行分析。事务层采用TLP传输事务&#xff0c;完整的TLP由TLPPrefix、TLP头、Payload和TLP Digest组成。TLP头是TLP中最关键的部分&#xff0c;一般由三个或四个双字的长度&#xff0c;其格式定义如…...

【C++详解】string各种接口如何使用保姆级攻略

文章目录 一、string介绍二、string使用构造函数析构函数赋值运算符重载string的遍历修改方法1、下标[]2、迭代器3、范围for 迭代器使用详解const迭代器反向迭代器&#xff08;reverse) Capacity(容量相关)size/lengthmax_sizecapacityclear/emptyshrink_to_fit(缩容)reserve(扩…...

深入理解 requestIdleCallback:浏览器空闲时段的性能优化利器

requestIdleCallback 核心作用 requestIdleCallback 是浏览器提供的 API&#xff0c;用于将非关键任务延迟到浏览器空闲时段执行&#xff0c;避免阻塞用户交互、动画等关键任务&#xff0c;从而提升页面性能体验。 基本语法 const handle window.requestIdleCallback(callb…...

QML鼠标事件和按键事件

1 鼠标事件 1.1 MouseArea组件 在QML中&#xff0c;鼠标事件主要通过MouseArea元素处理&#xff0c;它是用于检测和响应鼠标交互的核心组件。常用属性 cursorShape: 光标形状acceptedButtons: 设置响应鼠标的哪些按键事件&#xff0c;默认为鼠标左键 Qt.LeftButton&#xff1…...

Animaster:一次由 CodeBuddy 主导的 CSS 动画编辑器诞生记

我正在参加CodeBuddy「首席试玩官」内容创作大赛&#xff0c;本文所使用的 CodeBuddy 免费下载链接&#xff1a;腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 起心动念&#xff1a;我想要一个动画编辑器 那天我突然想到&#xff0c;如果能有一个简单好用的 CSS 动画编辑…...

Git 版本控制系统入门指南

Git 版本控制系统入门指南 一、Git 基础概念 1. 什么是 Git&#xff1f; Git 是一个分布式版本控制系统&#xff0c;它可以&#xff1a; 跟踪文件变化协调多人协作管理代码版本支持离线工作保证数据完整性 2. Git 的特点 分布式架构快速分支操作完整历史记录数据完整性保…...

GitHub 趋势日报 (2025年05月16日)

本日报由 TrendForge 系统生成 https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日整体趋势 Top 10 排名项目名称项目描述今日获星总星数语言1TapXWorld/ChinaTextbookPDF教材。⭐ 4792⭐ 19814Roff2xming521/WeClone&…...

C/C++之内存管理

1. 内存分布 我们定义的变量对于电脑来说也叫数据&#xff0c;同时电脑也会把这些数据分为不同的类型&#xff0c;分别是局部数据&#xff0c;静态数据&#xff0c;全局数据&#xff0c;常量数据和动态申请数据。 在 C 中&#xff0c;各类数据存储位置如下&#xff1a; • 局…...

GitHub文档加载器设计与实现

文章结构&#xff1a; 目录 GitHub文档加载器设计与实现 引言 架构设计 主要组件 核心功能 文档加载流程 加载单个文件 加载目录内容 错误处理与健壮性 分支回退策略 文件类型和大小限制 安全性考虑 SSL证书验证 使用示例 基本使用 测试环境配置 最佳实践 结…...

历史数据分析——中证白酒

简介 中证白酒指数选取涉及白酒生产业务相关上市公司证券作为指数样本,为投资者提供更多样化的投资标的。 估值 中证白酒总体的PB是5.26,在过去十年间位于23.76%,属于较低的水平。 中证白酒总体的PE是20.13,在过去十年间,位于14.24%,属于较低的水平。 从估值的角度似…...

PHP8.0版本导出excel失败

环境&#xff1a;fastadmin框架&#xff0c;不是原版接手的项目。PHP8.0,mysql5.7. code // 创建一个新的 Spreadsheet 对象 $spreadsheet new Spreadsheet(); $worksheet $spreadsheet->getActiveSheet();// 设置表头 $worksheet->setCellValue(A1, ID); $worksheet…...

Seata源码—5.全局事务的创建与返回处理二

大纲 1.Seata开启分布式事务的流程总结 2.Seata生成全局事务ID的雪花算法源码 3.生成xid以及对全局事务会话进行持久化的源码 4.全局事务会话数据持久化的实现源码 5.Seata Server创建全局事务与返回xid的源码 6.Client获取Server的响应与处理的源码 7.Seata与Dubbo整合…...

mac-M系列芯片安装软件报错:***已损坏,无法打开。推出磁盘问题

因为你安装的软件在Intel 或arm芯片的mac上没有签名导致。 首先打开任何来源操作 在系统设置中配置&#xff0c;如下图&#xff1a; 2. 然后打开终端&#xff0c;输入&#xff1a; sudo spctl --master-disable然后输入电脑锁屏密码 打开了任何来源&#xff0c;还遇到已损坏…...

端到端自动驾驶系统实战指南:从Comma.ai架构到PyTorch部署

引言&#xff1a;端到端自动驾驶的技术革命 在自动驾驶技术演进历程中&#xff0c;端到端&#xff08;End-to-End&#xff09;架构正引领新一轮技术革命。不同于传统分模块处理感知、规划、控制的方案&#xff0c;端到端系统通过深度神经网络直接建立传感器原始数据到车辆控制…...

MoveIt Setup Assistant 在导入urdf文件的时候报错

在使用MoveIt Setup Assistant导入urdf文件的时候(load a urdf or collada robot model)&#xff0c;找到urdf文件后MoveIt Setup Assistant闪退并报错&#xff1a; Warning: Ignoring XDG_SESSION_TYPEwayland on Gnome. Use QT_QPA_PLATFORMwayland to run on Wayland anyway…...

uniapp +vue +springboot多商家订餐系统

uniapp vue springboot多商家订餐系统&#xff0c;这个系统我整理调试的多商家&#xff0c;多用户的&#xff0c;多端小程序订餐系统&#xff0c;主要包含了uniapp小程序端&#xff0c;管理后台页面vue端&#xff0c;后台功能接口Springboot端&#xff0c;源码齐全&#xff0c;…...

docker迅雷自定义端口号、登录用户名密码

在NAS上部署迅雷&#xff0c;确实会带来很大的方便。但是目前很多教程都是讲怎么部署docker迅雷&#xff0c;鲜有将自定义配置的方法。这里讲一下怎么部署&#xff0c;并重点讲一下支持的自定义参数。 一、部署docker 在其他教程中&#xff0c;都是介绍的如下命令&#xff0c…...

联想笔记本黑屏了,排线出问题还是静电

以下引用 联想电脑屏幕不亮&#xff0c;电源键和键盘灯均正常的解决办法&#xff08;超简单&#xff09;_拯救者屏幕不亮,键盘有电-CSDN博客 昨天正常关机后&#xff0c;今天一早来工位打开电脑&#xff0c;美美开始玩手机。 一会之后抬头屏幕是黑的&#xff0c;还以为自动息…...

uniapp -- uCharts 仪表盘刻度显示 0.9999999 这样的值问题处理。

文章目录 🍉问题🍉解决方案🍉问题 在仪表盘上,23.8变成了 23.799999999999997 🍉解决方案 formatter格式化问题 1:在 config-ucharts.js 或 config-echarts.js 配置对应的 formatter 方法 formatter: {yAxisDemo1: function (...

为 Spring Boot 应用程序构建 CI/CD 流水线

为 Spring Boot 应用程序创建构建/部署流水线涉及多个步骤&#xff0c;而 Jenkins 可以作为强大的工具来自动化这些流程。在本教程中&#xff0c;我们将指导您为托管在 GitHub 上的 Spring Boot 应用程序设置流水线&#xff0c;使用 Jenkins 构建该应用程序&#xff0c;并将其部…...

数值分析填空题速通

填空题速通 文章目录 填空题速通误差与误差传播均差插值与误差范数、赋范线性空间与内积、内积空间范数代数精度数值微分积分误差迭代方程与收敛阶微分方程数值解法的迭代公式与阶 误差与误差传播 例 设 a 1.414 a 1.414 a1.414&#xff0c; b − 0.576 b -0.576 b−0.57…...

day016-系统负载压力测试-磁盘管理

文章目录 1. 系统负载2. 模拟系统高负载2.1 模拟cpu负载2.2 模拟IO负载 3. 磁盘接口分类4. 思维导图 1. 系统负载 系统负载是衡量系统繁忙程度的指标负载值接近或超过cpu核心总数表示系统负载高负载高常见原因&#xff1a;1.占用cpu过多导致2.占用磁盘IO过多导致&#xff08;I…...

DeepSeek指令微调与强化学习对齐:从SFT到RLHF

后训练微调的重要性 预训练使大模型获得丰富的语言和知识表达能力,但其输出往往与用户意图和安全性需求不完全匹配。业内普遍采用三阶段训练流程:预训练 → 监督微调(SFT)→ 人类偏好对齐(RLHF)。预训练阶段模型在大规模语料上学习语言规律;监督微调利用人工标注的数据…...

安全性(一):加密算法总结

一、加密算法分类总览 加密类型关键特性代表算法主要用途对称加密加解密使用同一个密钥DES、3DES、AES、SM4数据加密传输、存储非对称加密公钥加密&#xff0c;私钥解密&#xff08;或反向&#xff09;RSA、DSA、ECC、SM2密钥交换、数字签名、身份认证哈希算法不可逆摘要MD5、…...

DeepSeek 赋能军事:重塑现代战争形态的科技密码

目录 一、引言&#xff1a;AI 浪潮下的军事变革与 DeepSeek 崛起二、DeepSeek 技术原理与特性剖析2.1 核心技术架构2.2 独特优势 三、DeepSeek 在军事侦察中的应用3.1 海量数据快速处理3.2 精准目标识别追踪3.3 预测潜在威胁 四、DeepSeek 在军事指挥决策中的应用4.1 战场态势实…...

我司助力高校打造「智慧创新AI学习中心」

为推动AI教育融合跨领域应用&#xff0c;东吴大学于2025年4月举行「智慧创新AI学习中心」揭牌仪式&#xff0c;并宣布正式启动AI特色课程与教学空间建置计画。此次建置由我司协助整体教室空间与设备规划&#xff0c;导入最新NVIDIA GeForce RTX 50系列桌上型电脑&#xff0c;并…...

AI赋能把“杂多集合”转化为“理想集合”的数学建模与认知升级

AI赋能把“杂多集合”转化为“理想集合”的数学建模与认知升级 一、核心概念定义 杂多集合&#xff08;Chaotic Set&#xff09; 定义&#xff1a;元素间关系模糊、结构无序的集合 数学表达&#xff1a;C{x∣x∈X,P(x)}&#xff0c;其中 P(x) 是模糊隶属函数 实例&#xf…...

NVC++ 介绍与使用指南

文章目录 NVC 介绍与使用指南NVC 简介安装 NVC基本使用编译纯 C 程序编译 CUDA C 程序 关键编译选项示例代码使用标准并行算法 (STDPAR)混合 CUDA 和 C 优势与限制优势限制 调试与优化 NVC 介绍与使用指南 NVC 是 NVIDIA 提供的基于 LLVM 的 C 编译器&#xff0c;专为 GPU 加速…...

Redis 事务与管道:原理、区别与应用实践

在现代分布式系统开发中&#xff0c;Redis 作为高性能的内存数据库&#xff0c;其事务处理和管道技术是开发者必须掌握的核心知识点。本文将深入探讨 Redis 事务和管道的实现原理、使用场景、性能差异以及最佳实践&#xff0c;帮助开发者根据实际需求选择合适的技术方案。 一、…...

Git 多人协作

目录 情景一 情景二 合并分支 情景一 目标&#xff1a;远程 master 分支下的 file.txt 文件新增代码 "aaa","bbb"。 实现&#xff1a;由开发者1新增 "aaa" ,开发者2新增 bbb。 条件&#xff1a;在一个分支下合作完成。 针对以上情景我们要注意…...

Unity 人物模型学习笔记

一、关于模型的检查 拿到人物模型时&#xff0c;检查人物&#xff1a; 位置信息是否在0点布线/UV是否正常身体各部分是否分开各部分命名是否清晰骨骼需要绑定 二、Unity人物动画 https://www.bilibili.com/video/BV1cc41197mF?spm_id_from333.788.recommend_more_video.-1&a…...

【和春笋一起学C++】(十四)指针与const

将const用于指针&#xff0c;有两种情况&#xff1a; const int *pt; int * const pt; 目录 1. const int *pt 2. int * const pt 3. 扩展 1. const int *pt 首先看第一种情况&#xff0c;const在int的前面&#xff0c;有如下语句&#xff1a; int peoples12&#xff1…...

AI知识梳理——RAG、Agent、ReAct、LangChain、LangGraph、MCP、Function Calling、JSON-RPC

AI技术I AI技术II RAG &#x1f4cc; 高度凝练表达 RAG &#xff08;检索增强生成&#xff09;是一种结合信息检索与生成式人工智能的技术框架&#xff0c;旨在提升大型语言模型&#xff08;LLM&#xff09;的输出准确性和实用性。通过在生成响应前引入外部知识库的信息&#…...

ModuleNotFoundError: No module named ‘SDToolbox‘

(py311) C:>python Python 3.11.11 | packaged by Anaconda, Inc. | (main, Dec 11 2024, 16:34:19) [MSC v.1929 64 bit (AMD64)] on win32 Type “help”, “copyright”, “credits” or “license” for more information. from SDToolbox import PostShock_eq Tracebac…...

在宝塔中使用.NET环境管理部署 .NET Core项目

本次采用的演示环境未腾讯云轻量级服务器&#xff0c;使用应用模板&#xff0c;选择宝塔liunx面板。 一、登录宝塔安装环境 直接选择免密登录 进入腾讯云webshell后&#xff0c;输入bt&#xff0c;选择14 选择网站选择.NET项目安装.NET环境管理安装对应的.NET 版本 注意&…...

【DAY21】 常见的降维算法

内容来自浙大疏锦行python打卡训练营 浙大疏锦行 目录 PCA主成分分析 t-sne降维 线性判别分析 (Linear Discriminant Analysis, LDA) 作业&#xff1a; 什么时候用到降维 降维的主要应用场景 知识点回顾&#xff1a; PCA主成分分析t-sne降维LDA线性判别 通常情况下&#xff0c;…...

Linux面试题集合(3)

一秒刷新一次某个进程的状况 top -d 1 -p pid ’显示pid为1、2、3的进程的状况 top -p 1,2,3&#xff08;按上键选择某个进程&#xff09; 强制杀死进程 kill -9 pid 说一下ps和top命令的区别 ps命令只能显示执行瞬间的进程状态 top命令实时跟进进程状态 你在工作中什么情况下…...

Pytorch实现常用代码笔记

Pytorch实现常用代码笔记 基础实现代码其他代码示例Network ModulesLossUtils 基础实现代码 参考 深度学习手写代码 其他代码示例 Network Modules Pytorch实现Transformer代码示例 Loss PyTorch实现CrossEntropyLoss示例 Focal Loss 原理详解及 PyTorch 代码实现 PyTorc…...

vscode vue 项目 css 颜色调色版有两个

vue 项目 css 颜色调色版有两个&#xff0c;不知道是哪个插件冲突了。 这个用着很别扭&#xff0c;一个个插件删除后发现是 Vue - Official 这个插件问题&#xff0c;删了就只有一个调色版了。...

MySQL刷题相关简单语法集合

去重 distinct 关键字 eg. &#xff1a;select distinct university from user_profile 返回行数限制&#xff1a; limit关键字 eg. &#xff1a;select device_id from user_profile limit 2 返回列重命名&#xff1a;as 关键字 eg.&#xff1a;select device_id as user_in…...

MySQL多条件查询深度解析

一、业务场景引入 在数据分析场景中&#xff0c;我们经常会遇到需要从多个维度筛选数据的需求。例如&#xff0c;某教育平台运营团队希望同时查看"山东大学"的所有学生以及所有"男性"用户的详细信息&#xff0c;包括设备ID、性别、年龄和GPA数据&#xff…...

RT Thread FinSH(msh)调度逻辑

文章目录 概要FinSH功能FinSH调度逻辑细节小结 概要 RT-Thread&#xff08;Real-Time Thread&#xff09;作为一款开源的嵌入式实时操作系统&#xff0c;在嵌入式设备领域得到了广泛应用。 该系统不仅具备强大的任务调度功能&#xff0c;还集成了 FinSH命令行系统&#xff0c…...