优化js的执行

  • 避免使用setTimeout和setInterval进行视觉更新操作;使用 requestAnimationFrame。
  • 将长时间运行的JavaScript 从主线程转移到 Web Workers.
  • 使用 micro-tasks在不同的框架上修改DOM
  • 使用浏览器开发者工具和JavaScript Profiler来测量js对运行的影响

使用 requestAnimationFrame 进行视觉修改

当你想在特定的时间进行页面视觉修改,使用如下:

/**
 * If run as a requestAnimationFrame callback, this
 * will be run at the start of the frame.
 */
function updateScreen(time) {
  // Make visual updates here.
}

requestAnimationFrame(updateScreen);

你可能想使用setTimeout亦或setInterval来进行视觉上的修改,但是,你要记住,回调函数的执行是放在帧的某一点上执行,一般都是咋帧的最后执行,所以常常会导致帧的丢失。

事实上,jQuery中默认的animate操作可以使用setTimeout!你可以使用 patch it to userequestAnimationFrame, 我强烈推荐。

减少复杂度或者使用Web Workers

js运行在浏览器的主线程中,运行在主线程中的还有样式的计算,布局和页面渲染等。

最好的是让你的js程序运行在3-4ms之内,如果长时间的运行将阻塞主线程的其他程序运行,要记住,js是单线程执行的。

大多数情况子啊,你可以在Web Workers上使用纯粹的计算工作,例如,如果不需要访问DOM。数据处理和遍历,例如排序和搜索,在web workers上工作非常好。

var dataSortWorker = new Worker("sort-worker.js");
dataSortWorker.postMesssage(dataToSort);

// The main thread is now free to continue working on other things...

dataSortWorker.addEventListener(‘message‘, function(evt) {
   var sortedData = evt.data;
   // Update data on screen...
});

并不是所有的工作都适用于这个模式:Web Workers不适合DOM的获取操作。你的工作必须在主线程的话,可以考虑使用一个定量处理方法,你可以将一个庞大的工作划分成很多微小的工作,每个微小的工作不耗时几毫秒,并且每一帧(frame)中运行requestAnimationFrame处理函数。

var taskList = breakBigTaskIntoMicroTasks(monsterTaskList);
requestAnimationFrame(processTaskList);

function processTaskList(taskStartTime) {
  var taskFinishTime;

  do {
    // Assume the next task is pushed onto a stack.
    var nextTask = taskList.pop();

    // Process nextTask.
    processTask(nextTask);

    // Go again if there’s enough time to do the next task.
    taskFinishTime = window.performance.now();
  } while (taskFinishTime - taskStartTime < 3);

  if (taskList.length > 0)
    requestAnimationFrame(processTaskList);

}

为了让用户确保程序在执行,你要使用 using a progress or activity indicator.

知道你的js程序的 “frame tax”

当测量一个框架,库或者你自己的代码的时候,了解在frame-by-frame的基准上你的代码耗费多少资源是非常重要的!

当进行performance-critical动画(比如scroll和transition)时是非常重要的!

使用chrome浏览器中的开发者工具进行检测的效果如下:

如果你发现你运行了js,你首先要允许js检测:

你可以看到你的js文件运行情况:

你可以看见那些js耗时很久,你可以依次进行优化

避免在微小的优化上关注太多

虽然一个元素的offsetTop比getBoundingClientRect()函数的执行要快很多,但是,你每一帧中可能只会指定这样的函数几次而已,然而浏览器执行这样的函数的速度是非常快的,所以,你不用在这种微小的优化上放置太多的注意力,因为实际上,对于你的项目而言,它的优化坏是非常小的。

原文:https://developers.google.com/web/fundamentals/performance/rendering/optimize-javascript-execution?hl=en

时间: 2024-10-04 00:33:22

优化js的执行的相关文章

页面优化——js异步加载

同步加载 在介绍js异步加载之前,我们先来看看什么是js同步加载.我们平时最常使用的就是这种同步加载形式: <script src="http://XXX.com/script.js"></script> 同步模式,又称阻塞模式,会阻止浏览器的后续处理,停止了后续的解析,因此停止了后续的文件加载(如图像).渲染.代码执行.一般的script标签(不带async等属性)加载时会阻塞浏览器,也就是说,浏览器在下载或执行该js代码块时,后面的标签不会被解析,例如在he

浅析JS异步执行机制

前言 JS异步执行机制具有非常重要的地位,尤其体现在回调函数和事件等方面.本文将针对JS异步执行机制进行一个简单的分析. 从一份代码讲起 下面是两个经典的JS定时执行函数,这两个函数的区别相信对JS有一定基础的同学是十分清楚的.timeout仅仅只会执行一次,而interval则会执行多次. setTimeout(function (args) { console.log('timeout') }, 1000); setInterval(function (args) { console.log

浅析js的执行顺序

javascript是一种描述型的脚本语言,是一种解析语言,由浏览器动态解析,不同种类的浏览器不同版本的浏览器对于js的解析有着微小的差别,不同浏览器的js解析引擎效率也有高低,下面来给大家分析一下js的执行顺序,希望对大家能有所帮助,欢迎大家交流指正. 首先js的执行过程分为两大部分,第一部分,解析过程,也称预编译期.主要工作就是对于js的代码中声明的所有变量和函数进行预处理.需要注意的是,再此进行处理的仅是声明函数,而对于变量的处理仅是声明,并开辟出一块内存空间,不进行复制操作. 第二部分,

不同浏览器(chrome,firefox,IE)在JQuery与原生JS之执行性能比较

本次测试所用浏览器为chrome(36.0.1985.125m),firefox(31.0),IE(8.0) 1. 比较JQuery在不同浏览器对于js的执行性能 计算插入20000条div节点所需时间 for(var i=0;i<20000;i++){ var divTag = document.createElement('div'); $("#chn").append(divTag); } Result: 时间单位ms chrome 584 614 593 574 596

node js 异步执行流程控制模块Async介绍

1.Async介绍 sync是一个流程控制工具包,提供了直接而强大的异步功能.基于Javascript为Node.js设计,同时也可以直接在浏览器中使用. Async提供了大约20个函数,包括常用的 map, reduce, filter, forEach 等,异步流程控制模式包括,串行(series),并行(parallel),瀑布(waterfall)等. 项目地址:https://github.com/caolan/async 2. Async安装 npm install async 3.

Google Pagespeed,自动压缩优化JS/CSS/Image

Google Pagespeed,自动压缩优化JS/CSS/Image 浏览:257 发布日期:2015/07/05 分类:技术分享 关键字: Nginx Appache Pagespeed 自动压缩优化JS/CSS/Image 这个周末,把服务器的Nginx升级了下,并加入了Google Pagespeed模块 效果很明显: 页面加载的多个JS.CSS会自动合并压缩处理 发现新版本的Pagespeed能很好的发现处理用户加载的第三方JS库,如jQuery 发现新版本的lazyload_imag

Html和JS文件未使用UTF-8编码导致部分JS函数执行不正确

昨天写Windows应用程序用的前端HTML页面时,发现了一个奇怪的问题,一段简单的JS代码,竟然执行错误. function replaceSymbol(){ var val_exp = $('#calc_expression').val(); alert(val_exp); val_exp=val_exp.replace(/(/g,'(').replace(/)/g,')').replace(/×/g,'*').replace(/÷/g,'/'); alert(val_exp); $('#c

js常见执行方法

$(document).load(); 当web页面以及其附带的资源文件,如CSS,Scripts,图片等,加载完毕后执行此方法.常用于检测页面(及其附带资源)是否加载完毕. $(document).ready();当页面DOM对象加载完毕,web浏览器能够运行JS时,此方法即被触发.如果你想尽快执行JS,可以使用此方法.[在html的头部的script标签中的,不处于ready()中的JS代码将早于ready()执行] $(document).unload();此事件在停止浏览页面的时候触发,

JS代码执行机制

JS代码从编译到执行 我们写出一段JS代码,JS的引擎并不是按照我们书写的顺序从上到下顺序编译并且执行的,首先是按照自己的规则对我们的代码先进行编译,然后从上到下执行编译的代码. 在全局作用域中,JS首先会对我们的函数进行声明,然后就是我们经常听到的变量提升机制,然后才是按照我们书写代码的顺序,来进行编译,然后在执行编译的代码. 看如下代码: function fn(){ console.log(a); } fn(); var a = "value"; 非常常见的一个面试题fn函数执行