I just went through some vedio related to javascript performance which is great, Here is the notes I made:

  • Scope management

1. Identifier Resolution

Every time the function is executed, the execution context is created. The scope chain in the execution context stores the objects to be resolved in order.

sequence in the scope chain.

    1. with/catch
    2. local variables
    3. global variables

According to the scope chain, we can see the deeper you go the scope chain, the longer it take to resolve the identifers.

Recomendation:

    1. store out of scope varialbes in local variables, espeically global variables
    2. avoid With statement
    3. be careful with try/catch clause
    4. use sparsly closure.
    5. don't forget var when declaring variables
  • Data access

  Accessing data from literal variable and local variable is fartest.

Array item, object property look up takes more time.

property depth, the deeper the property, the longer it takes to retrieve. for example, object.name < object.name.name

property notation

object.name and object["name"] no difference generally. safari. dot notation is faster.

Recommendation

Store them in local variables, if the following happens:

1. if any object property accessed more than once.

2. any array item accessed more than once.

3. minimize deep object property/array item look up

example:

function process (data){

if(data.count>0) {

 for (var i=0;i<data.count;i++){

processdata(data.item[i]);

}

}

}

after change made:

function process (data){

var count = data.count;

     item = data.item;

if(count>0){

for(var i=0;i<count;i++)

  processdata(item[i]);

}
  • Loops

What does matter?

Amount of the work done per iteration, including the terminal condition evaluation incrementing/decrementing, here is the example:

for(var i=0;i<values.length;i++)
{
process (values[i]);
}

Recommendation:

  • Eliminate the object propery/array item lookups
  • Combine control condition and control variable change - work avoidance
var len = values.length

for (var i=len; i--;){

process(values[i]);

}
  • Avoid foreach statement which calls another function, here is the example:
values.foreach( function (data){

  process(data);

})

Reasons:

  1. Create execution context and destory
  2. The new execution context has its own scope chain.

Resolution:

8x peformance boost if we go with the regular loop like while, for, etc.

  • DOM

1. HTMLCollection Objects.

document.images,

document.getElementsByTagName

They are automatcially updated when the uderlying document is changed.

var divs = document.getElementByTagName("div");

for(var i=0;i<div.length;i++){

   var newdiv = document.createElement("div");

   document.body.appendChild(newdiv);

}

What the result if we run the script above:

infinite loop!! it's a infinite loop.

  • HtmlCollection element look like arrays, but are not bracket notation, length property
  • it represents the result of a specific query
  • the query is re-run each time the object is accessed.
  • including acessing lenth and specific items
  • much slower than accessing the same on the arrays (exceptions: Opera, Safira). here is the example:
var items = [{},{},{},{},{},{},{}];

for( var i=0;i<items.length;i++){

}

var divs = document.getElementByTagName("div");

for(var i=0;i<divs.length;i++){

}
the performance difference: firefox:15X; chrome: 53X; IE:68X

After change made: no much difference.

for( var i=0;len=divs.length;i<len;i++){

}

for(var i=0;i<divs.length;i++){

}

Recommendaton:

  • minimize accessing to the property of a object. store length, items in local variables if used frequently.
  • if you need to access items in order frequently, copy into a regular array.

Reflow

When reflow happen

  • Initial page load
  • Browser window resize
  • Layout style applied
  • Add/remove dom node
  • Layout information retrieved

How to avoid reflow:

  • DocumentFragment

It's a dcoument-like object, consider a child of the document from which it was created, not visually represented, when you pass documentFragement to appendChild(), appends all of its children rather than itself.

var list = document.getElementById("list");

var fragment = document.createDocumentFragment();

for(var i=0;i<10;i++){

 var item = document.createElement("li");

 item.innerHTML =  "Option #" + (i+1);

 fragment.appenChild(item); --No reflow

}

list.appenChild(fragment); --reflow

Recommendation:

  • Minimize the changes on style property (element.style.height = "100PX")
  • define CSS class with all changes and just change the className property

Layout information retrieved

all the statements below causes reflow:

var width = element.offsetwidth;

var scrollleft = element.scrollleft;

var display = window.getComputedStyle(div, '');

Recommendation on Speed up Dom:

  • Be careful using HTMLCollection objects
  • Perform DOM manipulation off the document
  • Change CSS classes, not CSS styles
  • Be careful when accessing layout information

Javascript performance的更多相关文章

  1. nosql db and javascript performance

    http://blog.csdn.net/yiqijinbu/article/details/9053467 http://blog.nosqlfan.com/tags/javascript http ...

  2. how to optimize javascript performance

    https://developers.google.com/speed/articles/optimizing-javascript http://developer.yahoo.com/perfor ...

  3. how to measure function performance in javascript

    how to measure function performance in javascript Performance API Performance Timeline API Navigatio ...

  4. 我所知道的Javascript

    javascript到了今天,已经不再是我10多年前所认识的小脚本了.最近我也开始用javascript编写复杂的应用,所以觉得有必要将自己的javascript知识梳理一下.同大家一起分享javas ...

  5. 45 Useful JavaScript Tips, Tricks and Best Practices(有用的JavaScript技巧,技巧和最佳实践)

    As you know, JavaScript is the number one programming language in the world, the language of the web ...

  6. 转:45 Useful JavaScript Tips, Tricks and Best Practices

    原文来自于:http://flippinawesome.org/2013/12/23/45-useful-javascript-tips-tricks-and-best-practices/ 1 – ...

  7. [Webpack] Analyze a Production JavaScript Bundle with webpack-bundle-analyzer

    Bundle size has a huge impact on JavaScript performance. It's not just about download speed, but all ...

  8. JavaScript周报#184

    This week’s JavaScript news Read this issue on the Web | Issue Archive JavaScript Weekly Issue 184Ju ...

  9. Performance js

    转贴:https://10up.github.io/Engineering-Best-Practices/javascript/#performance Performance Writing per ...

随机推荐

  1. 小技巧--字符串输入从a[1]开始

    char a[100],b[100]; cin>>a>>(b+1);//cin: abcd abcd cout<<a[1]<<endl<<b ...

  2. BZOJ2752: [HAOI2012]高速公路(road)

    2752: [HAOI2012]高速公路(road) Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 608  Solved: 199[Submit][ ...

  3. Leetcode#56 Merge Intervals

    原题地址 排序+合并,没啥好说的 第一次尝试C++的lambda表达式,有种写js的感觉,很神奇 c11就支持了lambda表达式,仔细想想,我学C++大概就是在09~10年,c11还没有发布,不得不 ...

  4. 导入ApiDemo报错,找不到R文件

    1.先检查当前ApiDemo对应的SDK版本是否一致(项目右键-Properties-Android) 2.查看是什么错误.我的就是layout中的progressbar_2.xml中所有组件的id前 ...

  5. UML活动图(转载)

    概述: 活动图是另一个重要的UML图来描述系统的动态方面. 活动图基本上是代表流程形成一个活动到另一个活动的流程图.活动可以被描述为一个系统的操作. 因此,绘制控制流从一个操作到另一个.此流可以是连续 ...

  6. BZOJ 1087状态压缩DP

    状态压缩DP真心不会写,参考了别人的写法. 先预处理出合理状态, 我们用二进制表示可以放棋子的状态,DP[I][J][K]:表示现在处理到第I行,J:表示第I行的状态,K表示现在为止一共放的棋子数量. ...

  7. SOA之(1)——SOA架构基础概念

    在深入探讨什么是面向服务的架构(SOA)之前,先建立一些基本的概念和术语的基本描述而非严格定义,所以也许有些定义在业内还存留争议,此处暂且忽略. 架构基础 技术架构(Technology Archit ...

  8. ID3决策树---Java

    1)熵与信息增益: 2)以下是实现代码: //import java.awt.color.ICC_ColorSpace; import java.io.*; import java.util.Arra ...

  9. Static、final、abstract、接口、构造方法及java语法总结

    Static:定义类的时候一般不用static来修饰,在一定意义上,用static修饰的字段可以作为全局变量,static修饰的字段和方法存储在类的内存区域,所有实例共享.static字段和方法都是属 ...

  10. ZOJ3717 Balloon(2-SAT)

    一个很玄乎的问题,但听到2-SAT之后就豁然开朗了.题目的意思是这样的,给你n个点群,每个点群里面有两个点,你要在每个点群里面选一个点,以这些点做半径为r的圆,然后r会有一个最大值,问的就是怎么选这些 ...