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.pswp.cn/bicheng/76258.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/76258.shtml
英文地址,請注明出處:http://en.pswp.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 封裝…