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

JavaScript性能优化(下)

1. 使用适当的算法和逻辑

JavaScript性能优化是一个复杂而重要的话题,尤其是在构建大型应用时。通过使用适当的算法和逻辑,可以显著提高代码的效率和响应速度。以下是一些关键策略和实践,用于优化JavaScript性能:

1.1. 采用适当的数据结构和算法

  • 选择合适的数据结构:不同的数据结构在不同的场景下表现优异。使用对象或Map来存储键值对,使用数组存储有序数据,使用集合处理唯一值。
  • 选择高效的算法:例如,排序算法的选择(快排、归并等)会影响性能。选择复杂度低的算法可以显著提高处理速度。

1.2. 减少DOM操作

  • 批量更新:尽量减少与DOM的交互,可以通过离线操作(使用DocumentFragment)来批量更新DOM。
  • 缓存选择器:将频繁使用的DOM元素缓存到变量中,以减少重复的DOM查询。

1.3. 使用事件委托

通过将事件处理程序添加到一个父元素,而不是每个子元素,可以显著减少内存使用和事件绑定数量。这种方法适用于动态添加的元素。

1.4. 优化循环

  • 减少循环中的计算:将不变的计算移到循环外部。
  • 使用for而非forEach:在某些情况下,使用传统的for循环比forEach略快。

1.5. 异步处理

  • 使用Promises和async/await:优化异步代码结构,以提升可读性和性能。
  • 避免阻塞:使用setTimeout将长时间运行的任务分割成更小的任务,允许浏览器在处理这些任务时更新UI。

1.6. 内存管理

  • 减少内存泄漏:确保不再需要的引用被清除,以便垃圾回收机制可以有效地回收内存。
  • 使用弱引用:对于不需要保留的对象,使用WeakMapWeakSet,以便可以被垃圾回收。

1.7. Compression and Minification

  • 压缩和最小化代码:使用工具(如UglifyJS、Terser)压缩、混淆和最小化JavaScript代码,以减少文件大小,提升加载速度。

1.8. 延迟加载和懒加载

通过懒加载图片和其他资源,用户在需要时才加载内容,从而减少初始加载时间。

1.9. 性能监控

使用工具,如Chrome DevTools进行性能分析,找出瓶颈、内存问题和渲染性能问题,进而进行针对性的优化。

1.10. 使用最新的JavaScript特性

  • 利用ES6+:的新特性(如箭头函数、解构赋值、模板字符串等)可以提升代码的效率和可读性。
  • 模块化:用ES模块(ESM)来拆分代码,使得按需加载成为可能。

2. 性能分析工具

在JavaScript性能优化过程中,使用性能分析工具可以帮助开发者识别性能瓶颈,并提供具体的优化建议。以下是一些常用的JavaScript性能分析工具及其主要功能、特点和使用方法:

2.1. Chrome DevTools

作为Chrome浏览器内置的开发者工具,Chrome DevTools提供了许多强大的性能分析功能。

  • 性能面板

    • 记录性能:可以录制并分析页面加载和运行时性能,包括JavaScript执行、样式计算、布局和绘制时间等。
    • 分析堆栈:利用火焰图(Flame Graphs)可以直观地查看每个函数的执行时间和调用关系。
    • 帧速率(FPS)监测:可以查看每个帧的渲染时间,识别可能导致卡顿的操作。
  • 内存面板

    • 内存快照:可以生成JavaScript堆的快照,识别内存泄漏和不必要的内存使用。
    • 分配分析:期间的内存分配统计帮助识别哪些部分的代码消耗了过多内存。
  • 网络面板

    • 资源请求:详细查看网络请求的加载时间、大小和状态码,帮助优化资源请求和加载顺序。

2.2. Lighthouse

Lighthouse是一个开源工具,支持在Chrome DevTools、命令行和作为CI/CD工具使用。

  • 性能审计

    • 综合报告:评估页面的加载性能、可访问性、最佳实践和SEO,根据得分提供优化建议。
    • 关键指标:提供诸如首次内容绘制(First Contentful Paint)、最大内容绘制(Largest Contentful Paint)、交互时间(Time to Interactive)等重要性能指标。
  • PWA支持:能够评估渐进式Web应用(PWA)的性能和合规性。

2.3. WebPageTest

WebPageTest是一个功能强大的在线性能测试工具,可以从不同的地点和设备上测试网页的加载性能。

  • 详细的加载时间分析

    • 逐步加载视图:展现每个请求的具体加载时间,可以帮助开发者了解瓶颈。
    • 可视化效果:提供视图比较和屏幕截图,使开发者可以直观地看到加载过程中的各个阶段。
  • 优化建议:自动生成的性能优化建议,基于Web最佳实践。

2.4. New Relic

New Relic是一款企业级应用性能监控解决方案,适用于复杂的web应用。

  • 实时监控:能够监测应用的实时性能,提供查询响应时间、流量和错误率的详细报告。
  • 事务跟踪:帮助识别具体请求的性能瓶颈,更好地理解代码在大流量情况下的表现。

2.5. Dynatrace

Dynatrace是一个全面的应用监控解决方案,适合微服务和云环境。

  • 深度性能分析:自动识别性能问题,并提供智能修复建议。
  • 端到端监控:提供用户交互的真实监测,从前端到后端的全链路监控,确保用户体验。

2.6. Sentry

Sentry主要用于监测和捕捉错误,但也提供性能监控功能。

  • 错误分析:捕获JavaScript错误和异常,并提供堆栈跟踪信息。
  • 性能监控:追踪每个请求的延迟,帮助识别慢请求和性能瓶颈。

2.7. React Profiler

对于使用React构建应用的开发者,React Profiler是一个专用的性能分析工具。

  • 组件性能监控:可以查看组件的渲染时间,识别频繁渲染的组件,优化组件性能。
  • 定位性能瓶颈:通过捕获组件树和渲染的详细信息,找出需要优化的部分。

2.8. jsPerf

jsPerf是一个比较不同JavaScript代码片段性能的在线工具。

  • 性能测试:可以轻松创建性能测试,对比多种实现的速度和效率,帮助选择最佳方案。
  • 社区分享:用户可以分享自己的测试用例,获取社区对不同方法性能的反馈。

2.9. Perfume.js

Perfume.js是一个轻量级的性能监测库。

  • 性能指标测量:可以轻松集成到应用中,测量如FCP、LCP、TBT等指标,并生成可视化报告。
  • 轻量和可定制:适合在需要自定义性能测量场景中使用。

2.10.总结

选择合适的性能分析工具有助于开发者清晰地了解应用的性能瓶颈和优化方向。不论是前端的加载性能、内存管理,还是后端的请求处理,性能分析工具都能提供极大的帮助。根据项目的特定需求,可以选择合适的工具进行深度分析和优化。

3. 代码分割和惰性加载

在现代JavaScript开发中,代码分割和惰性加载是两个有效的性能优化策略,特别是在构建大型应用程序时。这两种方法可以帮助减少初始加载时间,提高用户体验。下面是对这两种技术的详细介绍,包括它们的原理、优势和实现方式。

一、代码分割

1. 定义

代码分割 (Code Splitting) 是将应用程序的代码分割成多个小块(即模块),这些模块可以根据需要按需加载,而不是在初始加载时加载整个应用程序。这种方法非常适合大型应用程序,因为它可以减少初始下载的JavaScript文件的大小。

2. 关键概念

  • 动态导入 (Dynamic Imports):使用 JavaScript 的动态导入语法 import(),可以在运行时加载模块。这意味着可以在需要时只加载特定的代码块,而其他部分可以延迟加载,直至真正需要它们的时候。
  • Webpack和其它打包工具:这些工具支持代码分割,并提供配置选项,以便在构建过程中生成各个代码块。

3. 代码分割的优势

  • 减少初始加载时间:用户首次加载页面时,只下载必要的代码,其他部分可以在稍后加载。
  • 提升性能:减少文件大小可以改善页面的加载速度和响应时间。
  • 更好的用户体验:通过延迟加载不常用的功能,提高了应用的初始响应性。

4. 实现代码分割的示例

如果使用Webpack作为构建工具,可以通过简单的配置和动态导入实现代码分割。

使用Webpack的代码分割示例
// 在你的JavaScript文件中  
function loadModule() {  import('./path/to/your/module.js')  .then(module => {  // 使用导入的模块  module.someFunction();  })  .catch(err => {  console.error("模块加载失败: ", err);  });  
}  // 在需要的时候调用  
loadModule();  

 通过这样的方式,module.js 只有在调用 loadModule 函数时才会被加载,避免了不必要的加载。

5. Webpack配置示例

在Webpack配置中,可以设置 optimization.splitChunks 来实现代码分割。

module.exports = {  // 其他配置项  optimization: {  splitChunks: {  chunks: 'all', // 对所有模块应用分割  }  }  
};  

二、惰性加载

1. 定义

惰性加载 (Lazy Loading) 是一种技术,只有在需要时才加载对象或资源。对于JavaScript应用,它通常用于延迟加载图片、模块或路由,以减少页面初始加载的负担。

2. 惰性加载的关键概念

  • 交互元素的延迟加载:该技术适用于仅在用户与特定部分交互时才需要加载的元素,例如图像或组件。用户在滚动到图片可视区域时再加载,而不是在初始加载时就将所有内容都下载。
  • 路由懒加载:在单页应用(SPA)中,可以使用惰性加载技术,当用户导航到路由时,相关模块才会被加载。

3. 惰性加载的优势

  • 快速响应时间:用户不会等待不必要的资源加载,能够更快地交互。
  • 减少带宽使用:避免加载未查看的内容,有助于减小数据传输量。
  • 改善整体性能:聚焦于首次用户体验,逐步加载其它内容可提升整体应用性能。

4. 实现惰性加载的示例

使用现代浏览器的 IntersectionObserver API 可以轻松实现图片的惰性加载。

使用IntersectionObserver的惰性加载示例
const images = document.querySelectorAll('img[data-src]');  const imgObserver = new IntersectionObserver((entries, observer) => {  entries.forEach(entry => {  if (entry.isIntersecting) {  const img = entry.target;  img.src = img.dataset.src; // 使用data-src替换src  imgObserver.unobserve(img); // 一旦加载完毕,取消观察  }  });  
});  // 开始观察所有包含data-src属性的图片  
images.forEach(image => {  imgObserver.observe(image);  
});  

5. 使用React进行惰性加载

对于使用React的应用程序,可以通过 React.lazy() 和 Suspense 实现组件的惰性加载。

React惰性加载示例
import React, { Suspense, lazy } from 'react';  const LazyComponent = lazy(() => import('./LazyComponent'));  function App() {  return (  <div>  <h1>惰性加载示例</h1>  <Suspense fallback={<div>加载中...</div>}>  <LazyComponent />  </Suspense>  </div>  );  
}  

结论

代码分割和惰性加载是提升JavaScript应用性能的重要技术。通过合理应用这些策略,可以显著减少初始加载时间,提高用户体验。开发人员应该根据实际情况选择合适的代码分割和惰性加载方法,灵活运用这些工具与技术,以实现最佳的性能效果。

4. 减少重绘和重排

减少重绘(Repaint)和重排(Reflow)是JavaScript性能优化中非常重要的部分,尤其是在Web开发中。理解这两个概念及其影响,可以帮助开发者改善页面的渲染性能,提高用户体验。以下是对重绘和重排的详细介绍,以及如何有效减少它们。

一、重绘与重排的定义

1. 重绘(Repaint)

重绘是指浏览器在页面内容改变时,仅重新绘制受影响的部分,而无需影响布局的操作。例如,改变元素的背景色、文本颜色等视觉效果,但不会改变元素的大小或位置。

2. 重排(Reflow)

重排是指浏览器需要重新计算元素的布局,通常在以下情况发生:

  • 改变元素的尺寸(如宽度、高度)
  • 改变元素的位置(如margin或padding)
  • 更新DOM结构(添加、移除或修改元素)
  • 浏览器窗口大小调整

重排比重绘更为昂贵,因为它涉及到更复杂的计算和更新。

二、重排和重绘的性能影响

  • 性能开销:重排和重绘都会导致额外的开销。当浏览器执行重排时,可能会触发后续元素的重排,这可能导致页面闪烁、卡顿或延迟等影响用户体验的问题。
  • 影响用户体验:频繁的重排和重绘会导致页面性能下降,影响加载速度和滚动流畅性。

三、减少重绘和重排的策略

1. 批量DOM操作

  • 一次性修改:尽量将所有DOM更改合并到一次操作中,而不是分散在多个操作中。减少DOM操作的频率,有助于减少重排和重绘的次数。
const element = document.querySelector('#myElement');  
element.style.display = 'none'; // 隐藏  
element.style.width = '100px'; // 改变宽度  
element.style.height = '100px'; // 改变高度  
element.style.display = 'block'; // 显示  

 这是一个错误的创建多个重排的示例。尽量确保样式更新在一个批处理中完成,然后只应用一次绘制。

2. 使用DocumentFragment

使用 DocumentFragment 可以在内存中构造DOM树并仅在最后一次性添加到页面中,可以显著减少重排。

const fragment = document.createDocumentFragment();  
const newElement = document.createElement('div');  
newElement.textContent = 'Hello, World!';  
fragment.appendChild(newElement);  
document.body.appendChild(fragment); // 触发一次重绘,而不是多次  

3. 避免使用offsetHeight等触发重排的属性

  • 读取几何属性:调用如 offsetHeightclientWidth 等会导致浏览器强制计算样式,触发重排。
  • 避免频繁读取:在读写操作之间频繁读取这些属性会引起性能问题,建议将读取和写入分开。
// 会引起重排的示例  
const height = myElement.offsetHeight; // 强制计算布局  
myElement.style.height = height + 'px';   

4. 使用CSS3代替JavaScript进行动画

使用CSS3的动画和过渡效果可以减少重排,因为它们通常会在合成层中执行,避免了重排。

.myElement {  transition: all 0.3s ease;  
}  .myElement:hover {  transform: scale(1.1); // 使用变换而不是改变布局  
}  

5. 利用合成层

一些CSS属性(如transformopacity)会触发合成层,允许浏览器在GPU上处理元素,从而减少重排和重绘的次数。

6. 减少复杂的CSS选择器

使用简单的CSS选择器可以加快页面渲染速度,复杂的选择器会导致浏览器在应用样式时需要更多的计算,因此尽量简化选择器的嵌套。

7. 避免频繁的样式计算

在JavaScript中频繁地改变样式会导致重排,可以考虑使用类名来改变样式,而不是直接修改元素的每个样式属性。

// 使用类而不是逐个设置  
myElement.classList.add('myAnimator');  

四、性能监测

使用Chrome DevTools进行性能监测,可以检查页面的重绘和重排情况。通过性能面板,可以记录页面的渲染过程,找出导致性能降低的关键操作。

使用DevTools检查重排和重绘

  1. 打开Chrome DevTools(F12)。
  2. 选择“Performance”面板。
  3. 开始记录应用的性能。
  4. 进行交互,停止记录后分析结果。
  5. 检查重排和重绘的事件标记,识别频繁发生的位置。

结论

减少重绘和重排是提升JavaScript应用性能的关键策略之一。通过合理的DOM操作、利用合成层以及减少不必要的属性读取等方式,可以显著提高应用的流畅性和用户体验。通过性能监测工具及时识别和优化重排和重绘的瓶颈,是实现高效应用的重要环节。

5. 简化事件处理

在JavaScript开发中,简化事件处理是性能优化的重要方面。优化事件处理可以减少内存使用、提升应用性能,并改善用户体验。以下是关于如何优化事件处理的详细介绍,包括基本概念、常见问题、优化策略及具体示例。

一、事件处理的基本概念

事件处理是指在用户与应用程序交互时,出现特定事件(如点击、输入、滚动等),然后执行相应的JavaScript函数。事件处理的高效性直接影响应用性能和响应速度。

二、常见的事件处理问题

  1. 过多的事件监听器

    • 在DOM元素上为每个元素添加单独的事件监听器,会导致内存占用增加,并可能引发性能下降。
  2. 事件处理函数复杂

    • 复杂的事件处理逻辑可能导致性能下降,特别是在处理频繁触发的事件(如滚动、输入等)时。
  3. 内存泄漏

    • 事件监听器未被正确移除可能导致对象无法被垃圾回收,从而引发内存泄漏。
  4. 频繁创建新函数

    • 每次绑定事件时都创建新的函数,增加了内存使用,并且降低了事件处理的性能。

三、简化事件处理的优化策略

1. 使用事件委托

事件委托是将事件监听器添加到父元素上,而不是每个子元素。这种方法可以显著减少事件监听器的数量,并提升性能,尤其适合动态生成的内容。

示例
<ul id="myList">  <li>Item 1</li>  <li>Item 2</li>  <li>Item 3</li>  
</ul>  
const list = document.getElementById('myList');  list.addEventListener('click', function(event) {  if (event.target.tagName === 'LI') {  console.log('Clicked on:', event.target.textContent);  }  
});  

 在这个例子中,只有一个事件监听器被添加到ul元素上,所有的li子元素的点击事件都能通过事件冒泡捕获。

2. 防抖和节流

对于频繁触发的事件(如滚动、输入),采用防抖(debouncing)或节流(throttling)技术可以提高性能。

  • 防抖:在事件停止触发后一段时间才执行函数。适合处理如输入框中的键盘事件。
function debounce(func, delay) {  let timeout;  return function(...args) {  clearTimeout(timeout);  timeout = setTimeout(() => func.apply(this, args), delay);  };  
}  const input = document.getElementById('myInput');  
input.addEventListener('input', debounce(function() {  console.log('Input value:', this.value);  
}, 300));  
  • 节流:在特定时间间隔内只执行一次函数。适合处理如滚动事件。
function throttle(func, limit) {  let lastFunc;  let lastRan;  return function(...args) {  if (!lastRan) {  func.apply(this, args);  lastRan = Date.now();  } else {  clearTimeout(lastFunc);  lastFunc = setTimeout(() => {  if ((Date.now() - lastRan) >= limit) {  func.apply(this, args);  lastRan = Date.now();  }  }, limit - (Date.now() - lastRan));  }  };  
}  window.addEventListener('scroll', throttle(() => {  console.log('Scrolled!');  
}, 200));  

3. 使用逻辑分离

将事件处理逻辑与DOM操作解耦,确保事件处理函数尽量简洁,避免执行过多复杂的逻辑。这样有助于提高性能和可维护性。

示例
function handleClick(event) {  const item = event.target;  if (item.tagName === 'LI') {  processItemClick(item);  }  
}  function processItemClick(item) {  // 执行处理逻辑  console.log('Item clicked:', item.textContent);  
}  list.addEventListener('click', handleClick);  

这样,即使事件处理函数的逻辑复杂度增加,它们的职责仍旧清晰,有助于后续维护和优化。

总结

通过以上方法,可以显著提高JavaScript应用的性能,提升用户体验。优化事件处理不仅能减少内存和CPU的使用,还能提高页面的整体响应速度。在实际开发中,结合这些技术,可以根据具体情况选择最合适的优化策略。

相关文章:

JavaScript性能优化(下)

1. 使用适当的算法和逻辑 JavaScript性能优化是一个复杂而重要的话题&#xff0c;尤其是在构建大型应用时。通过使用适当的算法和逻辑&#xff0c;可以显著提高代码的效率和响应速度。以下是一些关键策略和实践&#xff0c;用于优化JavaScript性能&#xff1a; 1.1. 采用适当…...

优先级队列的应用

第一题&#xff1a; 题解思路&#xff1a; 1、建立降序的优先级队列&#xff08;底层是通过大堆来实现&#xff09;&#xff1b; 2、取最大的两个数来相减得到的结果再加入到优先级队列中(优先级队列会自动的排序)&#xff1b; 3、返回队列的头部或者0即可&#xff1b; 题解代…...

从 macos 切换到 windows 上安装的工具类软件

起因 用了很多年的macos, 已经习惯了macos上的操作, 期望能在windows上获得类似的体验, 于是花了一些时间来找windows上相对应的软件. 截图软件 snipaste​​​​​​ windows和macos都有的软件, 截图非常好用 文件同步软件 oneDrive: 尝试了不同的同步软件, 还是微软在各…...

探索原生JS的力量:自定义实现类似于React的useState功能

1.写在前面 本方案特别适合希望在历史遗留的原生JavaScript项目中实现简单轻量级数据驱动机制的开发者。无需引入任何框架或第三方库&#xff0c;即可按照此方法封装出类似于React中useState的功能&#xff0c;轻松为项目添加状态管理能力&#xff0c;既保持了项目的轻量性&am…...

Android系统深度定制:源码级拦截adb install的完整解决方案

一、需求背景与技术挑战 在Android 12.0系统定制开发中&#xff0c;我们面临一个关键需求&#xff1a;需要实现设备级应用安装管控&#xff0c;要求彻底禁用adb install安装方式。这种管控需要满足以下技术指标&#xff1a; 系统级全局拦截&#xff0c;覆盖所有adb install安装…...

基于大模型的非阵发性室性心动过速风险预测与诊疗方案研究报告

目录 一、引言 1.1 研究背景与意义 1.2 研究目的 1.3 国内外研究现状 二、非阵发性室性心动过速概述 2.1 定义与分类 2.2 发病机制 2.3 临床症状与诊断方法 三、大模型在预测中的应用原理 3.1 大模型简介 3.2 数据收集与预处理 3.3 模型训练与优化 3.4 预测原理与…...

HttpServletRequest是什么

HttpServletRequest 是 Java Servlet API 中的一个接口&#xff0c;表示 HTTP 请求对象。它封装了客户端&#xff08;如浏览器&#xff09;发送到服务器的请求信息&#xff0c;并提供了访问这些信息的方法。 1. 基本概念 作用&#xff1a; HttpServletRequest 提供了一种机制&…...

【现代深度学习技术】循环神经网络02:文本预处理

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上&#xff0c;结合当代大数据和大算力的发展而发展出来的。深度学习最重…...

【微服务】SpringBoot 整合 Lock4j 分布式锁使用详解

目录 一、前言 二、Lock4j 概述 2.1 Lock4j 介绍 2.1.1 Lock4j 是什么 2.1.2 Lock4j 主要特征 2.1.3 Lock4j 技术特点 2.2 Lock4j 支持的锁类型 2.3 Lock4j 工作原理 2.4 Lock4j 应用场景 三、springboot 整合 lock4j 3.1 前置准备 3.1. 1 导入依赖 3.2 基于Redis…...

如何将前端组件封装并发布到npm的步骤详解

以下是封装前端组件并发布至npm仓库的完整步骤指南,结合多个最佳实践和常见问题解决方案: 一、环境准备与项目初始化 创建项目结构 • 使用Vue CLI或Create React App初始化项目: vue create my-component-lib # Vue npx create-react-app my-component-lib --template ty…...

【QT】QWidget 概述与核心属性(API)

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;Qt 目录 一&#xff1a;&#x1f525; 控件概述 &#x1f98b; 控件体系的发展阶段 二&#xff1a;&#x1f525; QWidget 核心属性 &#x1f98b; 核心属性概览&#x1f98b; 用件可用&#xff08…...

vue + uniapp 实现仿百度地图/高德地图/美团/支付宝 滑动面板 纯css 实现

概要 使用百度地图、各种单车APP时&#xff0c;对地图上的滑动面板很感兴趣&#xff0c;于是根据自己的理解实现了一下 之前用的js实现&#xff0c;滑动的时候没有原生好 这一次用的css实现 代码 <template><view class"container"><mapstyle"…...

124. 二叉树中的最大路径和

https://leetcode.cn/problems/binary-tree-maximum-path-sum/description/?envTypestudy-plan-v2&envIdtop-interview-150对于这题我开始的思路是路径我们可以看作是一条线&#xff0c;我们确定一个点后可以往两侧延伸&#xff08;就是左右子树的方向&#xff09;&#x…...

spark运行架构

运行架构&#xff1a;Spark采用master - slave结构&#xff0c;Driver作为master负责作业任务调度&#xff0c;Executor作为slave负责实际执行任务。 核心组件&#xff1a; Driver&#xff1a;执行Spark任务的main方法&#xff0c;负责将用户程序转化为作业、调度任务、跟踪E…...

开源的7B参数OCR视觉大模型:RolmOCR

1. 背景介绍 早些时候&#xff0c;Allen Institute for AI 发布了 olmOCR&#xff0c;这是一个基于 Qwen2-VL-7B 视觉语言模型&#xff08;VLM&#xff09;的开源工具&#xff0c;用于处理 PDF 和其他复杂文档的 OCR&#xff08;光学字符识别&#xff09;。开发团队对该工具的…...

Http代理服务器选型与搭建

代理服务器选型-Squid 缓存加速 缓存频繁访问的网页、图片等静态资源&#xff0c;减少对原始服务器的重复请求&#xff0c;提升响应速度支持HTTP、HTTPS、FTP等协议&#xff0c;通过本地缓存直接响应客户端请求 访问控制 基于ACL&#xff08;访问控制列表&#xff09;实现精细…...

如何实现Microsoft Word (.docx) 格式到 FastReport .NET (.frx) 文件的转换

现代数据处理技术和文档工作流自动化需要集成各种文件格式&#xff0c;以确保软件产品之间的无缝交互。Microsoft Word 凭借其丰富的功能&#xff0c;已成为最受欢迎的文本编辑器之一&#xff0c;适用于各种任务。 有时&#xff0c;您可能需要将这些文档转换为其他应用程序特定…...

雷电多开器自动化运行、自动登录APP刷新日用户活跃量

文章目录 简介接单价格代码对爬虫、逆向感兴趣的同学可以查看文章,一对一小班教学(系统理论和实战教程)、提供接单兼职渠道:https://blog.csdn.net/weixin_35770067/article/details/142514698 简介 客户有一个APP,需要在雷电模拟器每天自动运行APP,每台模拟器设置不同的I…...

Dify教程01-Dify是什么、应用场景、如何安装

Dify教程01-Dify是什么、应用场景、如何安装 大家好&#xff0c;我是星哥&#xff0c;上篇文章讲了Coze、Dify、FastGPT、MaxKB 对比&#xff0c;今天就来学习如何搭建Dify。 Dify是什么 **Dify 是一款开源的大语言模型(LLM) 应用开发平台。**它融合了后端即服务&#xff08…...

《深入探秘:分布式软总线自发现、自组网技术原理》

在当今数字化浪潮中&#xff0c;分布式系统的发展日新月异&#xff0c;而分布式软总线作为实现设备高效互联的关键技术&#xff0c;其自发现与自组网功能宛如打开智能世界大门的钥匙&#xff0c;为多设备协同工作奠定了坚实基础。 分布式软总线的重要地位 分布式软总线是构建…...

spring扫描自定义注解注册bean

前言 我们知道&#xff0c;在spring中&#xff0c;我们只需要加上注解Component&#xff0c;就可以自动注入到spring容器中&#xff0c;如果我们自定义注解&#xff0c;怎么让spring识别到&#xff0c;注入到容器中呢&#xff0c;下面我们来看看。 基础使用 自定义注解 Tar…...

【RL系列】StepFun之Open-Reasoner-Zero

1. 简介 开源了一个大规模RL训练框架之Open-Reasoner-Zero&#xff0c;仅使用vanilla PPO&#xff0c;GAE中参数 λ 1 , γ 1 \lambda 1, \gamma 1 λ1,γ1&#xff0c;rule-based reward&#xff0c;不需要KL regularization就可以增加response length和benchmark上的指标。…...

括号匹配问题--栈

括号匹配问题 栈的应用代码概览栈操作函数详解1.初始化栈&#xff08;stackInit&#xff09;2.向栈中压入元素&#xff08;stackpush&#xff09;3.获取栈顶元素&#xff08;stacktop&#xff09;4.弹出栈顶元素&#xff08;stackpop&#xff09;5.销毁栈&#xff08;stackdest…...

LangChain4j(7):Springboot集成LangChain4j实现知识库RAG

我们之前的直接整合进SpringBoot进行实战&#xff0c;最终其实还会将查询到的内容&#xff0c;和对话上下文组合起来&#xff0c;发给LLM为我们组织语言进行回答: 配置一个Content Retriever 内容检索器&#xff0c;提供向量数据库和向量模型及其他参数将内容检索器绑定到AiSe…...

企业使用Excel开展数据分析限制和建议完整版

Excel作为企业数据分析的常用工具&#xff0c;虽然功能强大&#xff0c;但也存在一些限制和使用时的注意事项。以下是综合整理的关键点&#xff1a; 一、Excel在企业数据分析中的限制 数据处理规模有限 Excel的行列限制&#xff08;如Excel 2019及之前版本最多支持1,048,576行…...

41、web前端开发之Vue3保姆教程(五 实战案例)

一、项目简介和需求概述 1、项目目标 1.能够基于Vue3创建项目 2.能够基本Vue3相关的技术栈进行项目开发 3.能够使用Vue的第三方组件进行项目开发 4.能够理解前后端分离的开发模式 2、项目概述 使用Vue3结合ElementPlus,ECharts工具实现后台管理系统页面,包含登录功能,…...

Quill富文本编辑器支持自定义字体(包括新旧两个版本,支持Windings 2字体)

文章目录 1 新版&#xff08;Quill2 以上版本&#xff09;2 旧版&#xff08;Quill1版本&#xff09; 1 新版&#xff08;Quill2 以上版本&#xff09; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta n…...

Flutter命令行打包打不出ipa报错

Flutter打包ipa报错解决方案 在Flutter开发中&#xff0c;打包iOS应用时可能会遇到以下错误&#xff1a; error: exportArchive: The data couldn’t be read because it isn’ in the correct format. 或者 Encountered error while creating the IPA: error: exportArchive…...

UV安装与使用

1. 概述 GitHub&#xff1a;astral-sh/uv: An extremely fast Python package and project manager, written in Rust. 官网&#xff1a;uv An extremely fast Python package and project manager, written in Rust. 效率神器&#xff0c;基于Rust实现&#xff0c;比传统工具快…...

SQL练习题

数据表介绍 –1.学生表 Student(SId,Sname,Sage,Ssex) --SId 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别–2.课程表 Course(CId,Cname,TId) --CId 课程编号,Cname 课程名称,TId 教师编号–3.教师表 Teacher(TId,Tname) --TId 教师编号,Tname 教师姓名–4.成绩表…...

Rust Command无法执行*拓展解决办法

async fn run_cmd_async_out<I, S>(cmd: &str, args: I, timeout_s: u64, with_http_proxy: bool) -> Result<String> whereI: IntoIterator<Item S>,S: AsRef<OsStr>, {let mut cmd tokio::process::Command::new(cmd);// 让 sh 来运行命令&…...

利用Hadoop MapReduce实现流量统计分析

在现代大数据时代&#xff0c;处理和分析海量数据是一项常见的任务。Hadoop MapReduce提供了一种高效的方式来处理分布式数据集。本文将通过一个具体的示例——流量统计分析&#xff0c;来展示如何使用Hadoop MapReduce进行数据处理。 项目背景 在电信行业中&#xff0c;对用…...

Spring Boot应用程序接入ELK-003

Spring Boot应用程序接入ELK 一、项目依赖集成 在将Spring Boot应用程序接入ELK日志搜索引擎时&#xff0c;首先要在项目中集成相关依赖&#xff1a; &#xff08;一&#xff09;Logstash依赖 <dependency><groupId>net.logstash.logback</groupId><a…...

spark(一)

本节课围绕Spark Core展开深入学习&#xff0c;了解了Spark的运行架构、核心组件、核心概念以及提交流程&#xff0c;明晰其整体运行机制与各部分协作逻辑。重点聚焦于两个核心组件&#xff1b;对RDD相关概念进行了细致学习&#xff0c;包括其核心属性、执行原理、序列化方式、…...

绿电直供零碳园区:如何用清洁能源重塑企业竞争力?

引言 在全球积极应对气候变化的大背景下&#xff0c;“双碳” 目标已成为世界各国实现可持续发展的关键战略方向。我国也明确提出要在 2030 年前实现碳达峰&#xff0c;2060 年前实现碳中和&#xff0c;这一宏伟目标的提出&#xff0c;对各行各业都产生了深远影响&#xff0c;…...

国家科技奖项目答辩ppt设计_科技进步奖PPT制作_技术发明奖ppt美化_自然科学奖ppt模板

国家科学技术奖 为了奖励在科学技术进步活动中做出突出贡献的公民、组织&#xff0c;调动科学技术工作者的积极性和创造性&#xff0c;加速科学技术事业的发展&#xff0c;提高综合国力而设立的一系列奖项。每两三年评选一次。 科技奖ppt案例 WordinPPT / 持续为双一流高校、…...

LLM应用实战2-理解Tokens

文章目录 基本定义Tokenization 的作用主流 Tokenization 算法示例示例GPT-4o&GPT-4o miniGPT-3.5 & GPT-4 基本定义 Tokens 是大型语言模型&#xff08;LLM&#xff09;处理文本或代码的最小语义单元&#xff0c;可包含以下形式&#xff1a; 字符&#xff08;如英文…...

【Java面试系列】Spring Boot微服务架构下的分布式事务处理与性能优化详解 - 3-5年Java开发必备知识

【Java面试系列】Spring Boot微服务架构下的分布式事务处理与性能优化详解 - 3-5年Java开发必备知识 引言 在当今的微服务架构中&#xff0c;分布式事务处理和性能优化是面试中经常被问及的高频话题。随着系统规模的扩大&#xff0c;如何保证数据一致性和系统性能成为了开发者…...

NO.80十六届蓝桥杯备战|数据结构-字符串哈希|兔子与兔子(C++)

回忆&#xff1a;哈希函数与哈希冲突 哈希函数&#xff1a;将关键字映射成对应的地址的函数&#xff0c;记为 Hash(key) Addr 。哈希冲突&#xff1a;哈希函数可能会把两个或两个以上的不同关键字映射到同⼀地址&#xff0c;这种情况称为哈希冲突。 字符串哈希 定义⼀个把字…...

Spring MVC 请求类型注解详解

Spring MVC 请求类型注解详解 1. 核心注解分类 Spring MVC 中的请求处理注解分为以下几类&#xff1a; 类别注解示例作用范围方法级注解RequestMapping, GetMapping 等方法级别参数级注解RequestParam, RequestBody方法参数模型/会话注解ModelAttribute, SessionAttributes方…...

RabbitMQ的死信队列和ttl

TTL ttl即过期时间&#xff0c;rbbitmq可以对队列和消息设置过期时间&#xff0c;当消息到存活时间之后&#xff0c;还没有被消费&#xff0c;就会被自动清除 例如&#xff1a;在网上购物&#xff0c;经常会遇到一个场景&#xff0c;当下单超过24小时还未付款&#xff0c;订单…...

[特殊字符] Hyperlane:Rust 高性能 HTTP 服务器库,开启 Web 服务新纪元!

&#x1f680; Hyperlane&#xff1a;Rust 高性能 HTTP 服务器库&#xff0c;开启 Web 服务新纪元&#xff01; &#x1f31f; 什么是 Hyperlane&#xff1f; Hyperlane 是一个基于 Rust 语言开发的轻量级、高性能 HTTP 服务器库&#xff0c;专为简化网络服务开发而设计。它支…...

【后端开发】Spring MVC-常见使用、Cookie、Session

文章目录 代码总结初始化传递参数单参数多参数 传递对象后端参数重命名&#xff08;后端参数映射&#xff09;必传参数设置非必传参数 传递数组传递集合传递JSON数据JSON语法JSON格式转换JSON优点传递JSON对象 获取URL中参数传递文件 Cookie与SessionCookieCookie机制 SessionC…...

Element Plus 去掉表格外边框

使用el-table组件拖拽时&#xff0c; 想使用自定义样式进行拖拽, 想去掉外边框&#xff0c; 并在表头加入竖杠样式 css代码&#xff1a; <style lang"less" scoped>// 表格右边框线 .el-table--border::after {width: 0; }// 表格上边框线 :deep(.el-table__i…...

安全厂商安全理念分析

奇安信&#xff08;toB企业安全&#xff09; 安全理念&#xff1a;率先提出 “内生安全” 理念。即把安全能力内置到信息化环境中&#xff0c;通过信息化系统和安全系统的聚合、业务数据和安全数据的聚合、IT 人才和安全人才的聚合&#xff0c;让安全系统像人的免疫系统一样&a…...

GaussDB Plan Hint调优实战:从执行计划控制到性能优化

GaussDB Plan Hint调优实战&#xff1a;从执行计划控制到性能优化 一、GaussDB Plan Hint核心价值 执行计划控制原理 mermaid graph TD A[SQL提交] --> B(优化器决策) B --> C{使用Hint?} C -->|是| D[强制指定执行路径] C -->|否| E[自动生成最优计划] D --&g…...

【力扣hot100题】(078)跳跃游戏Ⅱ

好难啊&#xff0c;我愿称之为跳崖游戏。 依旧用了两种方法&#xff0c;一种是我一开始想到的&#xff0c;一种是看答案学会的。 我自己用的方法是动态规划&#xff0c;维护一个数组记录到该位置的最少步长&#xff0c;每遍历到一个位置就嵌套循环遍历这个位置能到达的位置&a…...

基于 DeepSeek API 实现一个简单的数据分析 Agent

写在前面 本文将带你一步步了解: 什么是(简单的)数据分析 Agent?为什么使用 LLM 进行数据分析?如何利用 DeepSeek API 的能力?设计并实现一个基于 Python 和 Pandas 的基础数据分析 Agent。探讨其局限性、安全考量及未来方向。我们的目标是构建一个简单的 Agent,它能理…...

VUE3+TS+elementplus+Django+MySQL实现从前端增加数据存入数据库,并显示在前端界面上

一、前言 前面实现了从数据库读取数据&#xff0c;显示在前端界面上VUE3TSelementplusDjangoMySQL实现从数据库读取数据&#xff0c;显示在前端界面上&#xff0c;以及使用VUE3TSelementplus创建一个增加按钮。今天通过在前端的增加功能&#xff0c;新增数据&#xff0c;传到后…...

Django 创建CSV文件

Django使用Python内置的CSV库来创建动态的CSV&#xff08;逗号分隔值&#xff09;文件。我们可以在项目的视图文件中使用这个库。 让我们来看一个例子&#xff0c;这里我们有一个Django项目&#xff0c;我们正在实现这个功能。创建一个视图函数 getfile() 。 Django CSV例子 …...