首页 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