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的使用,还能提高页面的整体响应速度。在实际开发中,结合这些技术,可以根据具体情况选择最合适的优化策略。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/76258.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蚂蚁 Flink 实时计算编译任务 Koupleless 架构改造

张冯君&#xff08;远远&#xff09; Koupleless PMC 蚂蚁集团技术工程师 就职于蚂蚁集团中间件团队&#xff0c;参与维护与建设蚂蚁 SOFAArk 和 Koupleless 开源项目、内部 SOFAServerless 产品的研发和实践。 本文 3488 字&#xff0c;预计阅读 11 分钟 业务背景 基于开源 A…

使用pycharm社区版调试DIFY后端python代码

目录 背景 前置条件 DIFY使用的框架 API服务调试配置步骤&#xff08;基于tag为0.15.3的版本&#xff09; 1.配置.env文件 2.关闭docker里面的docker-api-1服务 3.使用DOCKER启动本地环境需要用到的中间件&#xff0c;并暴露端口 注意事项一&#xff1a; 注意事项二&#xff1a…

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

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

MySQL体系架构(一)

1.1.MySQL的分支与变种 MySQL变种有好几个,主要有三个久经考验的主流变种:Percona Server,MariaDB和 Drizzle。它们都有活跃的用户社区和一些商业支持,均由独立的服务供应商支持。同时还有几个优秀的开源关系数据库,值得我们了解一下。 1.1.1.Drizzle Drizzle是真正的M…

【项目实训项目博客】prompt初版实践

通过对camel技术的理解&#xff0c;我们向其中添加了市场营销角色的prompt 初版设计如下&#xff1a; chatchainconfig.json { "chain": [ { "phase": "DemandAnalysis", "phaseType": "SimplePhase", "max_turn_step…

[Bond的杂货铺] CKS 证书也到货咯

最近比较忙&#xff0c;忘记写Blog了&#xff1a;&#xff09; 一年前黑五去官网蹲了一手Cyber Monday&#xff0c;买了英文考试券bundle&#xff0c;当时只考了cka,后来cks差点都忘记了。将近一年后&#xff0c;无意中收到官方的提醒邮件&#xff0c;说考试券本已过期&#x…

【回眸】Linux 内核 (十五) 之 多线程编程 上

前言 进程和线程 区别 线程API 1.创建线程 2.线程退出 3.线程等待 4.线程脱离 5. 线程ID获取及比较 6.创建及销毁互斥锁 7.创建及销毁条件变量 8. 等待 9.触发 多线程编程 后记 前言 高产的几天。 进程和线程 区别 进程——资源分配的最小单位&#xff0c;线…

127.0.0.1本地环回地址(Loopback Address)

127.0.0.1 是计算机网络中的一个特殊IPv4地址&#xff0c;称为本地环回地址&#xff08;Loopback Address&#xff09;&#xff0c;主要用于以下用途&#xff1a; 1. 基本定义 本地主机&#xff08;Localhost&#xff09;&#xff1a;该地址始终指向当前正在使用的计算机本身&a…

S7-1200 PLC热电偶和热电阻模拟量模块

热电偶和热电阻模拟量模块 S7-1200 PLC有专用用于对温度进行采集的热电偶模块SM1231 TC和SM 1231RTD。热电偶模块有4AI和8AI两种&#xff0c;下面以SM1231 TC 4AI为例看一下接线图。 该模块一共有4个通道&#xff0c;每个通道有两个接线端子&#xff0c;比如0&#xff0c;0-。…

深度了解向量引论

今天去研究了一个基本数学原理 这个其实需要证明 今天推导了一下这个公式&#xff0c;感觉收获挺大 下面是手工推导过程

Feign修仙指南:声明式HTTP请求的优雅之道

各位在微服务世界摸爬滚打的道友们&#xff01;今天要解锁的是Spring Cloud的绝世神通——Feign&#xff01;这货堪称HTTP界的"言出法随"&#xff0c;只需定义接口&#xff0c;就能自动生成HTTP请求代码&#xff01;从此告别手动拼装URL的苦日子&#xff0c;让你的代…

UDP学习笔记(四)UDP 为什么大小不能超过 64KB?

&#x1f310; UDP 为什么大小不能超过 64KB&#xff1f;TCP 有这个限制吗&#xff1f; 在进行网络编程或者调试网络协议时&#xff0c;我们常常会看到一个说法&#xff1a; “UDP 最大只能发送 64KB 数据。” 这到底是怎么回事&#xff1f;这 64KB 是怎么来的&#xff1f;TCP…

LabVIEW 中串口设备与采集卡的同步精度

在 LabVIEW 项目开发中&#xff0c;常涉及多种设备协同工作&#xff0c;如通过串口设备采集温度&#xff0c;利用采集卡&#xff08;如 NI 6251&#xff09;采集压力。此时&#xff0c;设备间的同步精度至关重要&#xff0c;它直接影响系统数据的准确性与可靠性。下面&#xff…

DP_AUX辅助通道介绍

DisplayPort&#xff08;简称DP&#xff09;是一个由PC及芯片制造商联盟开发&#xff0c;视频电子标准协会&#xff08;VESA&#xff09;标准化的数字式视频接口标准。该接口免认证、免授权金&#xff0c;主要用于视频源与显示器等设备的连接&#xff0c;并也支持携带音频、USB…

[GESP202312 五级] 平均分配

文章目录 题目描述输入格式输出格式输入输出样例 #1输入 #1输出 #1 输入输出样例 #2输入 #2输出 #2 提交链接提示解析参考代码 题目描述 小杨认为&#xff0c;所有大于等于 a a a 的完全平方数都是他的超级幸运数。 小杨还认为&#xff0c;所有超级幸运数的倍数都是他的幸运…

[Mysql]buffersize修改

1、找到my.cnf文件位置 ps -ef|grep mysqld 2、编辑my.cnf cd /etc/my.cnf.d vim my.cnf 一般修改为内存的50%~70% 3、重启服务 systemctl restart mysqld

清晰易懂的 Apollo 配置中心安装与使用教程

Apollo 是携程开源的分布式配置管理平台&#xff0c;支持配置实时推送、版本管理、权限控制等功能。本教程将手把手教你完成 Apollo 核心组件安装、基础配置管理及避坑指南&#xff0c;助你快速掌握企业级配置管理能力。 一、环境准备&#xff08;关键依赖&#xff09; 1. 基础…

PyTorch池化层详解:原理、实现与示例

池化层&#xff08;Pooling Layer&#xff09;是卷积神经网络中的重要组成部分&#xff0c;主要用于降低特征图的空间维度、减少计算量并增强模型的平移不变性。本文将通过PyTorch代码演示池化层的实现原理&#xff0c;并详细讲解最大池化、平均池化、填充&#xff08;Padding&…

如何构建并优化提示词?

提示词是一个小白最容易上手大模型的方式&#xff0c;提示词就是你告诉大模型应该如何去完成一项工作的系统性的命令&#xff0c;所以写一个好的提示词是比较关键的&#xff0c;那么如何写好一个提示词呢&#xff1f; 要写好提示词&#xff0c;其实就像我们要把一些命令清晰地传…

面向大模型的开发框架LangChain

这篇文章会带给你 如何使用 LangChain&#xff1a;一套在大模型能力上封装的工具框架如何用几行代码实现一个复杂的 AI 应用面向大模型的流程开发的过程抽象 文章目录 这篇文章会带给你写在前面LangChain 的核心组件文档&#xff08;以 Python 版为例&#xff09;模型 I/O 封装…