首页 > web前端 > js教程 > roven JavaScript 优化技术提升性能

roven JavaScript 优化技术提升性能

Mary-Kate Olsen
发布: 2025-01-04 10:16:34
原创
879 人浏览过

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中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板