• 避免使用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()函数的执行要快很多,但是,你每一帧中可能只会指定这样的函数几次而已,然而浏览器执行这样的函数的速度是非常快的,所以,你不用在这种微小的优化上放置太多的注意力,因为实际上,对于你的项目而言,它的优化坏是非常小的。

优化js的执行的更多相关文章

  1. 浅析JS异步执行机制

    前言 JS异步执行机制具有非常重要的地位,尤其体现在回调函数和事件等方面.本文将针对JS异步执行机制进行一个简单的分析. 从一份代码讲起 下面是两个经典的JS定时执行函数,这两个函数的区别相信对JS有 ...

  2. 优化 JS 条件语句的 5 个技巧

    优化 JS 条件语句的 5 个技巧 原创: 前端大全 前端大全 昨天 (给前端大全加星标,提升前端技能) 编译:伯乐在线/Mr.Dcheng http://blog.jobbole.com/11467 ...

  3. 动态加载js不执行解决办法

    这个问题的产生原因是:我们项目有一个主index文件,在主index文件中需要根据参数来判断是加载pc.html的内容还是加载mobile.html的内容,一开始是使用jquery来做的,没有问题,后 ...

  4. 【JS】js引擎执行过程

    概述 js引擎执行过程主要分为三个阶段,分别是语法分析,预编译和执行阶段,上篇文章我们介绍了语法分析和预编译阶段,那么我们先做个简单概括,如下: 语法分析: 分别对加载完成的代码块进行语法检验,语法正 ...

  5. js立即执行函数

    一.JS立即执行函数的写法 方式1.最前最后加括号 (function(){alert(1);}()); 方式2.function外面加括号   (function(){alert(1);})(); ...

  6. 优化JS加载时间过长的一种思路

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 去年公司在漳州的一个项目中,现场工程人员反映地图部分出图有点 ...

  7. js的执行机制

    遇到一个问题,因为自己本身就是菜鸟的原因,弄懂了还是很高兴的. console.log(a) function a() { return "this is function" } ...

  8. 关于js预编译以及js文件执行顺序的几个问题。

    关于js的执行原理,除去html页面中直接添加的代码,js代码的放置可以分为两类. //情形a           <script type="text/javascript" ...

  9. js eval()执行传参函数的写法

    .cs public class Message<T> { // 数据总数 public int? Total { get; set; } // 关键数据 public List<T ...

随机推荐

  1. JavaScript : 零基础打造自己的jquery类库

    写作不易,转载请注明出处,谢谢. 文章类别:Javascript基础(面向初学者) 前言 在之前的章节中,我们已经不依赖jQuery,单纯地用JavaScript封装了很多方法,这个时候,你一定会想, ...

  2. openlayer3 加载geoserver发布的WFS服务

    转自原文 openlayer3加载geoserver发布的WFS服务 openlayers3调用GeoServer发布的wfs 1 参考一 1.1 问题 openlayer3加载WFS存在跨域问题,需 ...

  3. 移除array中重复的item

    //move the repeated item            NSInteger index = [orignalArray count] - 1;            for (id o ...

  4. 【java】google的zxing架包生成二维码和读取二维码【可带文字和logo】

    承接RC4生成不重复字符串的需求之后,因为优惠码要方便用户使用的缘故,所以思来想去,觉得还是直接生成二维码给用户直接扫比较实用,也不用用户专门记录冗长的优惠码编号. ================= ...

  5. fast-cgi & php-fpm 等的理解

    原文地址:https://segmentfault.com/q/1010000000256516 网上有的说,fastcgi是一个协议,php-fpm实现了这个协议: 有的说,php-fpm是fast ...

  6. [Algorithm] Breadth First JavaScript Search Algorithm for Graphs

    Breadth first search is a graph search algorithm that starts at one node and visits neighboring node ...

  7. react 监听 移动端 手机键盘 enter 事件

    处理方法: (1)html书写 form标签中去掉action参数,定义onSubmit方法,如下所示: /** * 搜索框 组件 */ import React,{PureComponent} fr ...

  8. C++中sizeof(struct)怎么计算?(转)

    struct为空时,大小为1. 1. sizeof应用在结构上的情况 请看下面的结构: struct MyStruct { double dda1; char dda; int type; }; 对结 ...

  9. DataGridView.DataSource= list(Of T)

    注:本文样例的代码承接上篇文章:DataTable填充实体类返回泛型集合. 在D层查询完毕之后.我们将DataTable转化为泛型集合.然后经过中间各层,返回U层.到了这里,问题来了.我们这时候要将这 ...

  10. 【足迹C++primer】39、动态内存与智能指针(3)

    动态内存与智能指针(3) /** * 功能:动态内存与智能指针 * 时间:2014年7月8日15:33:58 * 作者:cutter_point */ #include<iostream> ...