当前位置: 首页 > news >正文

企业微网站与手机微信/互联网广告推广是什么

企业微网站与手机微信,互联网广告推广是什么,企业官网设计现状,新乡市做网站找哪个公司引言 在当今快速发展的Web世界中,性能已经成为衡量应用质量的关键指标。随着Web应用复杂度的不断提升,JavaScript作为前端开发的核心语言,其性能优化变得尤为重要。本文旨在全面深入地探讨JavaScript性能优化的各个方面,从基础概念到高级技巧,帮助开发者构建高效、流畅的Web应用…

在这里插入图片描述

引言

在当今快速发展的Web世界中,性能已经成为衡量应用质量的关键指标。随着Web应用复杂度的不断提升,JavaScript作为前端开发的核心语言,其性能优化变得尤为重要。本文旨在全面深入地探讨JavaScript性能优化的各个方面,从基础概念到高级技巧,帮助开发者构建高效、流畅的Web应用。

1. 理解JavaScript引擎

在深入性能优化之前,了解JavaScript引擎的工作原理是非常重要的。

V8引擎概述

在这里插入图片描述

V8是Google开发的开源JavaScript引擎,被用在Chrome浏览器和Node.js中。理解V8的工作原理有助于我们编写更高效的代码。

主要组成部分:
  • 解析器(Parser): 将JavaScript代码解析成抽象语法树(AST)。
  • 解释器(Interpreter): 直接执行AST,生成字节码。
  • 编译器(Compiler): 将热点代码(频繁执行的代码)编译成机器码,进一步提高执行效率。

JIT编译

在这里插入图片描述

即时编译(Just-In-Time Compilation,JIT)是现代JavaScript引擎的核心特性。

  • 基本原理: JIT在运行时将JavaScript代码编译成机器码,而不是解释执行。
  • 优化过程:
    1. 首次执行时,代码被解释执行。
    2. 多次执行的代码被标记为"热点代码"。
    3. 热点代码被编译成高效的机器码。

内存管理和垃圾回收

JavaScript的自动内存管理和垃圾回收机制极大地简化了开发,但也可能导致性能问题。

  • 垃圾回收算法: V8使用分代回收算法,将内存分为新生代和老生代。
  • 内存泄漏: 尽管有自动垃圾回收,开发者仍需注意避免内存泄漏,如清理不再使用的事件监听器。
// 可能导致内存泄漏的代码
function addHandler() {document.getElementById('button').addEventListener('click', () => {// 这里使用了大量内存const largeData = new Array(1000000).fill('x');console.log('Button clicked!');});
}// 改进版本
function addHandler() {const largeData = new Array(1000000).fill('x');document.getElementById('button').addEventListener('click', () => {console.log('Button clicked!');});
}

2. 高效的DOM操作

DOM操作是前端性能优化的重中之重。频繁的DOM操作会导致页面不断重绘和重排,严重影响性能。

虚拟DOM

虚拟DOM是React等现代前端框架中广泛使用的技术,它通过在内存中维护一个虚拟的DOM树来减少对实际DOM的操作。

  • 工作原理:
    1. 在内存中创建虚拟DOM树。
    2. 当数据变化时,创建新的虚拟DOM树。
    3. 比较新旧虚拟DOM树的差异(Diffing)。
    4. 只将差异部分应用到实际DOM上。

批量更新

即使不使用虚拟DOM,我们也可以通过批量更新来优化DOM操作。

// 低效的方式
for (let i = 0; i < 1000; i++) {document.body.innerHTML += '<div>' + i + '</div>';
}// 优化后的方式
const fragment = document.createDocumentFragment();
for (let i = 0; i < 1000; i++) {const div = document.createElement('div');div.textContent = i;fragment.appendChild(div);
}
document.body.appendChild(fragment);

使用CSS类替代样式操作

直接操作元素样式会导致频繁的重排。使用CSS类可以将多个样式更改合并为一次DOM更新。

// 低效的方式
element.style.backgroundColor = 'red';
element.style.color = 'white';
element.style.fontSize = '16px';// 优化后的方式
element.classList.add('highlight');// CSS
.highlight {background-color: red;color: white;font-size: 16px;
}

3. JavaScript代码优化

避免全局变量

全局变量不仅污染全局命名空间,还会降低变量查找的效率。

// 不推荐
var globalVar = 'I am global';// 推荐
(function() {var localVar = 'I am local';
})();

使用防抖(Debounce)和节流(Throttle)

对于频繁触发的事件(如滚动、调整窗口大小等),使用防抖和节流可以显著减少函数调用次数。

// 防抖函数
function debounce(func, wait) {let timeout;return function executedFunction(...args) {const later = () => {clearTimeout(timeout);func(...args);};clearTimeout(timeout);timeout = setTimeout(later, wait);};
}// 使用防抖
window.addEventListener('resize', debounce(() => {console.log('Window resized');
}, 250));

使用Web Workers进行复杂计算

Web Workers允许在后台线程中运行JavaScript,不会阻塞UI线程。

// main.js
const worker = new Worker('worker.js');worker.postMessage([1000000000, 10000]);worker.onmessage = function(e) {console.log('Result: ' + e.data);
};// worker.js
self.onmessage = function(e) {const result = heavyComputation(e.data[0], e.data[1]);self.postMessage(result);
}function heavyComputation(iterations, multiplier) {let result = 0;for (let i = 0; i < iterations; i++) {result += Math.random() * multiplier;}return result;
}

4. 高级优化技巧

内联缓存

V8引擎使用内联缓存来优化属性访问。重复访问相同类型对象的相同属性会被优化。

function Person(name, age) {this.name = name;this.age = age;
}const person1 = new Person('Alice', 25);
const person2 = new Person('Bob', 30);// 重复访问相同属性会被优化
console.log(person1.name);
console.log(person2.name);

隐藏类

V8使用隐藏类来优化对象属性的访问。始终以相同的顺序初始化对象属性可以帮助V8更好地优化代码。

// 不推荐
function Point(x, y) {this.x = x;if (y) {this.y = y;}
}// 推荐
function Point(x, y) {this.x = x;this.y = y;
}

使用位操作

对于某些数学运算,使用位操作可以显著提高性能。

// 使用位操作取整
const num = 3.7;
const rounded = num | 0; // 结果为3// 使用位操作判断奇偶
function isEven(num) {return !(num & 1);
}

5. 内存优化

对象池

对于频繁创建和销毁的小对象,使用对象池可以减少垃圾回收的压力。

class ObjectPool {constructor(createFn, maxSize = 100) {this.pool = [];this.createFn = createFn;this.maxSize = maxSize;}acquire() {return this.pool.length > 0 ? this.pool.pop() : this.createFn();}release(obj) {if (this.pool.length < this.maxSize) {this.pool.push(obj);}}
}// 使用对象池
const bulletPool = new ObjectPool(() => new Bullet());function shoot() {const bullet = bulletPool.acquire();// 使用bullet// ...// 当bullet不再需要时bulletPool.release(bullet);
}

WeakMap和WeakSet

使用WeakMap和WeakSet可以创建弱引用,有助于防止内存泄漏。

// 使用WeakMap存储额外的数据
const extraData = new WeakMap();const obj = {};
extraData.set(obj, 'some extra data');// 当obj不再被引用时,extraData中的数据也会被自动垃圾回收

6. 网络优化

资源预加载

使用<link rel="preload">可以指示浏览器预先加载关键资源。

<link rel="preload" href="critical.js" as="script">
<link rel="preload" href="critical.css" as="style">

HTTP/2和服务器推送

利用HTTP/2的多路复用和服务器推送特性可以显著提高资源加载速度。

# Nginx配置示例
location / {# 启用HTTP/2服务器推送http2_push_preload on;# 推送关键资源http2_push /styles/main.css;http2_push /scripts/main.js;
}

使用Service Worker缓存

Service Worker可以实现更高级的缓存策略,提供离线访问能力。

// 注册Service Worker
if ('serviceWorker' in navigator) {navigator.serviceWorker.register('/sw.js').then(registration => {console.log('Service Worker registered');}).catch(err => {console.log('Service Worker registration failed: ', err);});
}// sw.js
self.addEventListener('install', event => {event.waitUntil(caches.open('v1').then(cache => {return cache.addAll(['/','/styles/main.css','/scripts/main.js']);}));
});self.addEventListener('fetch', event => {event.respondWith(caches.match(event.request).then(response => {return response || fetch(event.request);}));
});

7. 性能监控和分析

Performance API

使用Performance API可以精确测量代码执行时间。

performance.mark('start');// 执行需要测量的代码
// ...performance.mark('end');
performance.measure('My operation', 'start', 'end');const measurements = performance.getEntriesByType('measure');
console.log(measurements);

Lighthouse

Lighthouse是一个自动化工具,用于改进网页质量。它可以分析页面性能、可访问性、最佳实践等。

# 使用Chrome DevTools中的Lighthouse面板
# 或者使用命令行
npm install -g lighthouse
lighthouse https://example.com

自定义性能指标

除了常见的性能指标(如First Contentful Paint, Time to Interactive等),还可以定义自己的业务相关指标。

// 定义自定义指标
window.myCustomMetric = {startTime: performance.now()
};// 在适当的时候记录结束时间
function recordMetric() {const endTime = performance.now();const duration = endTime - window.myCustomMetric.startTime;console.log(`Custom metric duration: ${duration}ms`);// 可以将这个指标发送到分析服务sendToAnalyticsService({metricName: 'myCustomMetric',duration: duration});
}

结论

JavaScript性能优化是一个广泛而深入的主题,涵盖了从底层引擎原理到高级应用技巧的方方面面。本文深入探讨了DOM操作优化、代码结构优化、内存管理、网络优化等关键领域,并提供了大量实用的代码示例和最佳实践。

然而,性能优化并非一蹴而就的工作,而是需要在整个开发生命周期中持续关注和改进的过程。开发者应该:

  1. 深入理解JavaScript引擎的工作原理。
  2. 在编码过程中时刻注意性能影响。
  3. 使用适当的工具监控和分析应用性能。
  4. 不断学习和实践新的优化技术。

通过实施这些策略和技巧,开发者可以显著提升Web应用的性能,为用户提供更快速、更流畅的体验。记住,性能优化是一个持续的过程,随着技术的发展,我们也需要不断更新我们的知识和技能。

相关文章:

深入理解JavaScript性能优化:从基础到高级

引言 在当今快速发展的Web世界中,性能已经成为衡量应用质量的关键指标。随着Web应用复杂度的不断提升,JavaScript作为前端开发的核心语言,其性能优化变得尤为重要。本文旨在全面深入地探讨JavaScript性能优化的各个方面,从基础概念到高级技巧,帮助开发者构建高效、流畅的Web应用…...

java+springboot实现定时任务

由于是初级程序员&#xff0c;基于注解的形式实现了一个简单的定时任务&#xff1b; 1. 使用Scheduled注解 Spring的Scheduled注解是一种非常简单和便捷的实现定时任务的方式。通过在方法上添加Scheduled注解&#xff0c;我们可以指定方法在特定的时间间隔或固定的时间点执行…...

1.3 数据库的发展历史与演变

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; 工&#x1f497;重&#x1f497;hao&#x1f497;&#xff1a;野老杂谈 ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题.…...

The field file exceeds its maximum permitted size of 1048576 bytes

场景: 再系统后台上传解析对账文件时大小超过1M就会报错 分析: 排查错误时了解MultipartFile默认上传大小就是1M,但是发现项目配置文件配置了上传大小100M,但是这个大小没有生效 因为项目启动并没有使用到这个配置大小并把他应用到file配置里面,经过测试发现只需要增加配置…...

【Es】python es操作

表 因为es是集群所以es_hosts是列表 from elasticsearch import Elasticsearch ES_HOSTS ["127.0.0.1:9200"] ES_HTTP_AUTH "******************"# 连接Es es Elasticsearch(hostsES_HOSTS ,http_authES_HTTP_AUTH ,maxsize60,timeout30,max_retries3…...

吃透前端文件上传与文件相关操作 多文件上传 大文件切片上传 拖拽上传 后续还会更新 断点续传等等

最近在学文件上传的操作,所以想把学习到东西写成一文章 这片文章是我以小白视角 慢慢学习并熟悉前端文件相关操作的流程总结出来的 前端文件上传 我首先想到是 <input type"file">**选择文件**</input>如果我们想限制上传文件的格式,大小或进行裁剪分片…...

用python制作88键赛博钢琴(能用鼠标键盘进行弹奏)

用python制作88键赛博钢琴 前言 恭喜这位博主终于想起了自己的账号密码&#xff01; 时光荏苒&#xff0c;转眼间已逾一年未曾在此留下墨香。尽管这一年间&#xff0c;博主投身于无尽的忙碌与挑战之中&#xff0c;但令人欣慰的是&#xff0c;那份初心与热情似乎并未因岁月的流…...

zdpgo_gin_login 框架20240815更新,增加注册路由的功能,一个方法自动拥有注册和登录两个API接口

zdpgo_gin_login 适配gin框架的登录注册功能组件&#xff0c;通过本框架轻松拥有登录注册相关的API接口 特性&#xff1a; 自动生成注册接口&#xff0c;具备密码加密的功能自动生成登录接口&#xff0c;具备JWT Token生成的功能 安装 go get github.com/zhangdapeng520/z…...

搭配Intel第13代酷睿处理器

高性能内存硬盘这么买 intel第13代酷睿已经于2022年10月底正式上市。相比于第12代酷睿性能大涨,内置20条PCle通道(16条PCle 5.0和4条PCle 4.0)、可最多支持128GB DDR5 5600/DDR4 3200双通道内存,搭配Z790系列主板组建高端性能平台,满足未来设计、游戏、专业应用等需求。如…...

uniapp快速回顾,新学websocket连接和BLE连接

Uni APP的学习 官方文档 uni-app官网 (dcloud.net.cn) 任何的博客都不如官方文档 一、快速复习 文件结构 main.js 功能&#xff1a;项目的入口文件&#xff0c;初始化 Vue 实例。 App.vue功能&#xff1a;根组件&#xff0c;包含应用的基本结构和全局样式。 manifest.js…...

激光测距传感器

系列文章目录 1.元件基础 2.电路设计 3.PCB设计 4.元件焊接 5.板子调试 6.程序设计 7.算法学习 8.编写exe 9.检测标准 10.项目举例 11.职业规划 文章目录 前言一、产品原理&#xff1a;二、产品介绍&#xff1a;三、应用特点四、应用案例&#xff1a;1.冶金钢铁板卷材开卷工…...

从数据分析到智能生产:AI在工业中的应用与未来

导语 | 人工智能技术的迅猛发展&#xff0c;正在引领第四次工业革命悄然而至。尽管 AI 技术在工业领域的部署仍有诸多难题亟待解决&#xff0c;但这并不能阻挡历史趋势的车轮滚滚向前&#xff0c;AI 正在为工业领域带来新的变革。今天&#xff0c;我们特邀了上海腾展长融董事 &…...

讲讲android art虚拟机的内存

Android 的 ART&#xff08;Android Runtime&#xff09;虚拟机的内存管理是一个复杂但重要的部分。 ART 虚拟机的内存主要包括以下几个关键区域&#xff1a; Java 堆&#xff08;Java Heap&#xff09;&#xff1a; 这是存储 Java 对象实例的主要区域。堆内存被进一步划分为不…...

构建高效社群生态:探索社群系统的力量与未来

在数字化时代的大潮中&#xff0c;社群系统作为连接人与人、促进信息交流与资源共享的重要平台&#xff0c;正日益成为企业、组织乃至个人不可或缺的一部分。它不仅为成员提供了展示自我、学习成长的舞台&#xff0c;更为社群管理者创造了高效管理、精准运营的工具。今天&#…...

数据结构——排序(3):交换排序(续)

目录 一、快速排序 (1)hoare版本 ①思路 ②过程图示 ③思考 ④代码实现 ⑤代码解释 &#xff08;2&#xff09;挖坑法 ①思路 ②过程图示 ③思考 ④代码实现 ⑤代码解释 &#xff08;3&#xff09;lomuto前后指针 ①思路 ②过程图示 ③思考 ④代码实现 ⑤代…...

2024最新版本Python安装及开发环境配置(vscodepython)

python安装 去Python官网下载最新版本&#xff1a; 接下来请一步步按照图片操作&#xff1a; 这样子就安装完成了 测试Python安装是否成功 先打开终端 右键Windows徽标&#xff0c;点击终端 然后输入python&#xff0c;如果如下图所示&#xff0c;就说明安装成功&#xff0…...

机器学习的定义

机器学习 机器学习的定义 机器学习是人工智能的一个分支&#xff0c;它使计算机系统能够从经验中学习并改进&#xff0c;而无需进行明确的编程。机器学习算法分析和解释数据&#xff0c;然后使用该数据来做出预测或决策&#xff0c;随着时间的推移&#xff0c;它们会变得更加准…...

2024-08-05升级问题:Android中ScrollView嵌套listview并解决listview显示问题

问题&#xff1a; 当ScrollView嵌套ListView时&#xff0c;ListView的高度设置为wrap_content时出现ListView的高度不能完全展开&#xff0c;而只显示的第一个Item。 解决方法&#xff1a; 按item的个数乘以高度计算出listview的总高度&#xff0c;并在数据变化时直接设置lis…...

【热度文章】Java设计模式之中介者模 式

ava 中的中介者模式 中介者模式&#xff08;Mediator Pattern&#xff09;是一种行为型设计模式&#xff0c;它通过一个中介对象来封装一系列对象之间的交互&#xff0c;使这些对象之间不需要显式地相互引用&#xff0c;从而降低了对象之间的耦合度。 中介者模式的主要角色&…...

【3.0】vue3语法

【3】vue3语法 【一】vue前提 【1】定义变量 # 1 const是常量--》不允许变的 # 2 咱们用 ref包裹后&#xff0c;是个对象&#xff0c;虽然对象是常量&#xff0c;对象不能变&#xff0c;对象.value可以变化 # 3 之所以定义成const原因是&#xff0c;后期不能修改对象 【对象.…...

Navicat Monitor 荣获 2024 年 DBTA “最佳数据库性能解决方案”读者选择奖

近期&#xff0c;Navicat 以其卓越的服务器监控与深度分析能力在众多杰出竞争者中脱颖而出&#xff0c;其监控产品 Navicat Monitor 荣获了 2024 年度 DBTA 读者选择奖中的“最佳数据库性能解决方案”殊荣。该奖项不仅是对 Navicat Monitor 在数据库监控与分析领域非凡实力的权…...

[论文笔记]ZeRO: Memory Optimizations Toward Training Trillion Parameter Models

引言 今天带来ZeRO: Memory Optimizations Toward Training Trillion Parameter Models的论文笔记。 大型深度模型提供了显著的准确性提升&#xff0c;但训练数十亿到数万亿个参数是具有挑战性的。现有的解决方案&#xff0c;如数据并行和模型并行&#xff0c;存在基本的局限…...

shuashuashua

CVE-2023-2130 靶标介绍&#xff1a; 在SourceCodester采购订单管理系统1.0中发现了一项被分类为关键的漏洞。受影响的是组件GET参数处理器的文件/admin/suppliers/view_details.php中的一个未知函数。对参数id的操纵导致了SQL注入。可以远程发起攻击。 通过标靶介绍可以知道…...

k8s之HPA

目录 1.HPA 2.部署 metrics-server 3.部署 HPA 4.总结 1.HPA HPA&#xff08;Horizontal Pod Autoscaling&#xff09;Pod 水平自动伸缩&#xff0c;Kubernetes 有一个 HPA 的资源&#xff0c;HPA 可以根据 CPU 利用率自动伸缩一个 Replication Controller、 Deployment 或…...

fun状态上传,并可手动控制

文章目录 引言上传原因:矛盾点:基础工程源码: 代码实操fun状态上传fun状态下发控制 引言 上传原因: 续上一节, 我们把fun像小灯一样, 加入了预警工程, 但是我们fun其实还有其他用处, 比如我们人工手动开风扇, 排风, 所以我们需要把fun的状态上传, 然后也可以通过服务器手动控制…...

【Canvas与艺术】四扇叶结

注意&#xff1a;此是一个看起来简单&#xff0c;实际上需要细细计算调整的拓扑图。 【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head&…...

基于DVWA-Brute Force(LowMedium)的渗透测试

Brute force主要是通过爆破达到渗透目的&#xff1a; Low 查看源代码&#xff1a; <?phpif( isset( $_GET[ Login ] ) ) {// Get username$user $_GET[ username ];// Get password$pass $_GET[ password ];$pass md5( $pass );// Check the database$query "SE…...

水库大坝安全预警系统的作用

“汛情就是命令&#xff0c;防汛就是责任”&#xff0c;为了防治和减轻洪涝带来的危害&#xff0c;需要一种以预警为先导的临灾位移监测系统--水库大坝安全预警系统&#xff0c;对可能会出现的灾害进行实时远程监控&#xff0c;尽可能做到隐患早发现、早决策、早治理&#xff0…...

容器化部署ES集群

文章目录 一、ElasticSearch基本概念1、索引(Index)2、文档(Document)3、分片和副本4、映射(Mapping) 二、容器部署ElasticSearch集群三、容器部署ElasticSearch伪集群 一、ElasticSearch基本概念 1、索引(Index) 在ElasticSearch中&#xff0c;索引是文档的集合&#xff0c;类…...

使用排名前三的华为解锁工具来绕过忘记的华为锁屏密码

如果您在未使用“设置”应用的情况下将华为手机恢复出厂设置&#xff0c;同时启用了出厂重置保护 (FRP) 安全功能&#xff0c;您的华为设备将卡在帐户验证界面。您可以使用帐户凭据轻松绕过此锁定。但是&#xff0c;假设您无法回忆起旧的帐户信息。在这种情况下&#xff0c;您应…...