首頁 web前端 js教程 roven JavaScript 優化技術提升效能

roven JavaScript 優化技術提升效能

Jan 04, 2025 am 10:16 AM

roven JavaScript Optimization Techniques to Boost Performance

身為暢銷書作家,我邀請您在亞馬遜上探索我的書。不要忘記在 Medium 上關注我並表示您的支持。謝謝你!您的支持意味著全世界!

JavaScript 最佳化對於增強應用程式效能和使用者體驗至關重要。我已經實施了各種技術來提高專案中的程式碼執行速度。以下是我發現特別有用的六種有效方法:

記憶化是一種強大的技術,我經常使用它來快取昂貴的函數結果。透過儲存昂貴操作的輸出,我們可以避免冗餘計算並顯著提高效能。這是我如何實現記憶化的例子:

function memoize(fn) {
  const cache = new Map();
  return function(...args) {
    const key = JSON.stringify(args);
    if (cache.has(key)) {
      return cache.get(key);
    }
    const result = fn.apply(this, args);
    cache.set(key, result);
    return result;
  };
}

const expensiveFunction = (n) => {
  // Simulate an expensive calculation
  let result = 0;
  for (let i = 0; i < n; i++) {
    for (let j = 0; j < n; j++) {
      result += i * j;
    }
  }
  return result;
};

const memoizedExpensiveFunction = memoize(expensiveFunction);

console.time('First call');
console.log(memoizedExpensiveFunction(1000));
console.timeEnd('First call');

console.time('Second call');
console.log(memoizedExpensiveFunction(1000));
console.timeEnd('Second call');
登入後複製
登入後複製
登入後複製

在此範例中,第一次呼叫記憶函數將花費更長的時間,但使用相同參數的後續呼叫將會更快,因為結果是從快取中檢索的。

去抖動和限制是我用來控制函數執行速率的技術,特別是對於效能密集型操作。去抖動確保函數僅在自上次調用以來經過一定時間後才被調用,而限制則限制在特定時間段內可以調用函數的次數。

以下是我實現去抖動的方法:

function debounce(func, delay) {
  let timeoutId;
  return function(...args) {
    clearTimeout(timeoutId);
    timeoutId = setTimeout(() => {
      func.apply(this, args);
    }, delay);
  };
}

const expensiveOperation = () => {
  console.log('Performing expensive operation...');
};

const debouncedOperation = debounce(expensiveOperation, 300);

// Simulate rapid function calls
for (let i = 0; i < 5; i++) {
  debouncedOperation();
}
登入後複製
登入後複製

這是一個節流範例:

function throttle(func, limit) {
  let inThrottle;
  return function(...args) {
    if (!inThrottle) {
      func.apply(this, args);
      inThrottle = true;
      setTimeout(() => inThrottle = false, limit);
    }
  };
}

const scrollHandler = () => {
  console.log('Handling scroll event...');
};

const throttledScrollHandler = throttle(scrollHandler, 100);

window.addEventListener('scroll', throttledScrollHandler);
登入後複製

這些技術對於處理捲動或調整大小等事件特別有用,在這些事件中,過多的函數呼叫可能會導致效能問題。

在創建物件和陣列時,我總是更喜歡使用文字表示法而不是建構函數。這種方式不僅更簡潔,而且執行速度也更快。對比一下:

// Slower
const obj1 = new Object();
obj1.name = 'John';
obj1.age = 30;

const arr1 = new Array();
arr1.push(1, 2, 3);

// Faster
const obj2 = { name: 'John', age: 30 };
const arr2 = [1, 2, 3];
登入後複製

文字表示法更有效率,因為它在單一操作中建立物件或數組,而建構函數方法需要多個步驟。

由於查找時間增加,全域變數會顯著影響效能。我有意識地努力盡量減少它們在我的程式碼中的使用。相反,我將變數封裝在函數或模組中以提高執行速度。以下是我如何重構程式碼以避免全域變數的範例:

// Avoid this
let counter = 0;
function incrementCounter() {
  counter++;
  console.log(counter);
}

// Prefer this
function createCounter() {
  let counter = 0;
  return function() {
    counter++;
    console.log(counter);
  };
}

const incrementCounter = createCounter();
incrementCounter();
incrementCounter();
登入後複製

透過使用閉包,我們可以在不依賴全域變數的情況下維護狀態,從而實現更快、更可預測的程式碼執行。

最佳化循環是我專注於提高效能的另一個領域。我更喜歡對陣列使用 for...of 循環,對物件使用 for...in 循環。這些結構通常比傳統的 for 迴圈更快、更易讀。此外,我嘗試避免不必要的數組方法鏈接,因為它可以創建中間數組並影響效能。這是最佳化循環使用的範例:

function memoize(fn) {
  const cache = new Map();
  return function(...args) {
    const key = JSON.stringify(args);
    if (cache.has(key)) {
      return cache.get(key);
    }
    const result = fn.apply(this, args);
    cache.set(key, result);
    return result;
  };
}

const expensiveFunction = (n) => {
  // Simulate an expensive calculation
  let result = 0;
  for (let i = 0; i < n; i++) {
    for (let j = 0; j < n; j++) {
      result += i * j;
    }
  }
  return result;
};

const memoizedExpensiveFunction = memoize(expensiveFunction);

console.time('First call');
console.log(memoizedExpensiveFunction(1000));
console.timeEnd('First call');

console.time('Second call');
console.log(memoizedExpensiveFunction(1000));
console.timeEnd('Second call');
登入後複製
登入後複製
登入後複製

在存取函數內的變數時,我發現使用局部變數而不是物件屬性可以加快執行速度。這是因為局部變數查找通常比物件上的屬性查找更快。以下是我如何使用此技術優化程式碼的範例:

function debounce(func, delay) {
  let timeoutId;
  return function(...args) {
    clearTimeout(timeoutId);
    timeoutId = setTimeout(() => {
      func.apply(this, args);
    }, delay);
  };
}

const expensiveOperation = () => {
  console.log('Performing expensive operation...');
};

const debouncedOperation = debounce(expensiveOperation, 300);

// Simulate rapid function calls
for (let i = 0; i < 5; i++) {
  debouncedOperation();
}
登入後複製
登入後複製

在此範例中,將物件屬性快取在局部變數中可以提高執行速度,尤其是在循環或頻繁調用的函數中。

這些最佳化技術顯著提高了我的 JavaScript 應用程式的效能。然而,值得注意的是,過早的最佳化可能會導致程式碼過於複雜。我始終建議在應用這些技術之前進行分析和測量效能,以確保它們解決應用程式中的實際瓶頸。

除了這些核心最佳化技術之外,我還發現了其他一些有助於加快 JavaScript 執行速度的做法:

  1. 使用嚴格模式:在腳本或函數的開頭添加“use strict”可以幫助及早捕獲錯誤並防止使用某些容易出錯的功能,從而可能提高性能。

  2. 避免不必要的 DOM 操作:最小化直接 DOM 互動和大量 DOM 更新可以顯著提高效能,尤其是在複雜的 Web 應用程式中。

  3. 利用 Web Workers:對於不需要 DOM 存取的運算密集型任務,Web Workers 可以將處理卸載到後台線程,保持主執行緒回應。

  4. 最佳化函數參數:當函數不使用「this」關鍵字時,請考慮使用箭頭函數來稍微提升效能。

  5. 使用適當的資料結構:選擇正確的資料結構(例如,Set 用於唯一值,Map 用於鍵值對)可以帶來更有效率的演算法和更好的效能。

  6. 利用瀏覽器快取:正確配置快取標頭可以減少伺服器負載並提高回訪使用者的應用程式回應能力。

  7. 最小化 JavaScript 檔案大小:使用縮小和壓縮技術來減少 JavaScript 檔案的大小,從而加快下載和解析時間。

  8. 避免不必要的函數調用:重構程式碼以消除冗餘函數調用,尤其是在循環或頻繁執行的程式碼路徑中。

  9. 使用模板文字進行字串連接:模板文字通常比傳統的字串連接方法更有效。

  10. 利用現代 JavaScript 功能:利用解構、擴充運算子和可選連結等功能來實現更簡潔且可能更快的程式碼。

這是一個結合了其中幾種附加最佳化技術的範例:

function memoize(fn) {
  const cache = new Map();
  return function(...args) {
    const key = JSON.stringify(args);
    if (cache.has(key)) {
      return cache.get(key);
    }
    const result = fn.apply(this, args);
    cache.set(key, result);
    return result;
  };
}

const expensiveFunction = (n) => {
  // Simulate an expensive calculation
  let result = 0;
  for (let i = 0; i < n; i++) {
    for (let j = 0; j < n; j++) {
      result += i * j;
    }
  }
  return result;
};

const memoizedExpensiveFunction = memoize(expensiveFunction);

console.time('First call');
console.log(memoizedExpensiveFunction(1000));
console.timeEnd('First call');

console.time('Second call');
console.log(memoizedExpensiveFunction(1000));
console.timeEnd('Second call');
登入後複製
登入後複製
登入後複製

在此範例中,我們使用嚴格模式,利用適當的資料結構(Set 和 Map),使用箭頭函數最佳化函數參數,使用模板文字進行字串連接,並示範解構等現代 JavaScript 功能的使用。我們也展示瞭如何設定 Web Worker 來卸載繁重的計算。

請記住,有效優化的關鍵是專注於能夠提供最顯著效能改進的領域。在應用最佳化技術之前,請務必分析您的程式碼並確定實際的瓶頸。在許多情況下,編寫乾淨、可讀的程式碼比可能只提供邊際收益的微優化更重要。

當您繼續優化 JavaScript 程式碼時,請記住 JavaScript 引擎和瀏覽器實作正在不斷發展。今天可能的優化在未來可能變得不必要,甚至適得其反。隨時了解最新的最佳實踐,並始終在現實場景中測試您的最佳化。

最後,不要忘記感知績效的重要性。雖然這些技術著重於實際執行速度,但漸進式載入、骨架螢幕和樂觀 UI 更新等因素可以顯著提高使用者對應用程式速度和回應能力的感知。

透過在整個開發過程中持續應用這些最佳化技術並隨時關注效能,您可以創建更快、更有效率的 JavaScript 應用程序,從而提供出色的用戶體驗。


101 本書

101 Books是一家由人工智慧驅動的出版公司,由作家Aarav Joshi共同創立。透過利用先進的人工智慧技術,我們將出版成本保持在極低的水平——一些書籍的價格低至 4 美元——讓每個人都能獲得高品質的知識。

查看我們的書Golang Clean Code,亞馬​​遜上有售。

請繼續關注更新和令人興奮的消息。購買書籍時,搜尋 Aarav Joshi 以尋找更多我們的書籍。使用提供的連結即可享受特別折扣

我們的創作

一定要看看我們的創作:

投資者中心 | 投資者中央西班牙語 | 投資者中德意志 | 智能生活 | 時代與迴響 | 令人費解的謎團 | 印度教 | 菁英發展 | JS學校


我們在媒體上

科技無尾熊洞察 | 時代與迴響世界 | 投資人中央媒體 | 令人費解的謎團 | | 令人費解的謎團 | >科學與時代媒介 |

現代印度教

以上是roven JavaScript 優化技術提升效能的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1670
14
CakePHP 教程
1428
52
Laravel 教程
1329
25
PHP教程
1276
29
C# 教程
1256
24
Python vs. JavaScript:學習曲線和易用性 Python vs. JavaScript:學習曲線和易用性 Apr 16, 2025 am 12:12 AM

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

從C/C到JavaScript:所有工作方式 從C/C到JavaScript:所有工作方式 Apr 14, 2025 am 12:05 AM

從C/C 轉向JavaScript需要適應動態類型、垃圾回收和異步編程等特點。 1)C/C 是靜態類型語言,需手動管理內存,而JavaScript是動態類型,垃圾回收自動處理。 2)C/C 需編譯成機器碼,JavaScript則為解釋型語言。 3)JavaScript引入閉包、原型鍊和Promise等概念,增強了靈活性和異步編程能力。

JavaScript和Web:核心功能和用例 JavaScript和Web:核心功能和用例 Apr 18, 2025 am 12:19 AM

JavaScript在Web開發中的主要用途包括客戶端交互、表單驗證和異步通信。 1)通過DOM操作實現動態內容更新和用戶交互;2)在用戶提交數據前進行客戶端驗證,提高用戶體驗;3)通過AJAX技術實現與服務器的無刷新通信。

JavaScript在行動中:現實世界中的示例和項目 JavaScript在行動中:現實世界中的示例和項目 Apr 19, 2025 am 12:13 AM

JavaScript在現實世界中的應用包括前端和後端開發。 1)通過構建TODO列表應用展示前端應用,涉及DOM操作和事件處理。 2)通過Node.js和Express構建RESTfulAPI展示後端應用。

了解JavaScript引擎:實施詳細信息 了解JavaScript引擎:實施詳細信息 Apr 17, 2025 am 12:05 AM

理解JavaScript引擎內部工作原理對開發者重要,因為它能幫助編寫更高效的代碼並理解性能瓶頸和優化策略。 1)引擎的工作流程包括解析、編譯和執行三個階段;2)執行過程中,引擎會進行動態優化,如內聯緩存和隱藏類;3)最佳實踐包括避免全局變量、優化循環、使用const和let,以及避免過度使用閉包。

Python vs. JavaScript:社區,圖書館和資源 Python vs. JavaScript:社區,圖書館和資源 Apr 15, 2025 am 12:16 AM

Python和JavaScript在社區、庫和資源方面的對比各有優劣。 1)Python社區友好,適合初學者,但前端開發資源不如JavaScript豐富。 2)Python在數據科學和機器學習庫方面強大,JavaScript則在前端開發庫和框架上更勝一籌。 3)兩者的學習資源都豐富,但Python適合從官方文檔開始,JavaScript則以MDNWebDocs為佳。選擇應基於項目需求和個人興趣。

Python vs. JavaScript:開發環境和工具 Python vs. JavaScript:開發環境和工具 Apr 26, 2025 am 12:09 AM

Python和JavaScript在開發環境上的選擇都很重要。 1)Python的開發環境包括PyCharm、JupyterNotebook和Anaconda,適合數據科學和快速原型開發。 2)JavaScript的開發環境包括Node.js、VSCode和Webpack,適用於前端和後端開發。根據項目需求選擇合適的工具可以提高開發效率和項目成功率。

C/C在JavaScript口譯員和編譯器中的作用 C/C在JavaScript口譯員和編譯器中的作用 Apr 20, 2025 am 12:01 AM

C和C 在JavaScript引擎中扮演了至关重要的角色,主要用于实现解释器和JIT编译器。1)C 用于解析JavaScript源码并生成抽象语法树。2)C 负责生成和执行字节码。3)C 实现JIT编译器,在运行时优化和编译热点代码,显著提高JavaScript的执行效率。

See all articles