Javascript performance
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.
- with/catch
- local variables
- 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:
- store out of scope varialbes in local variables, espeically global variables
- avoid With statement
- be careful with try/catch clause
- use sparsly closure.
- 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:
- Create execution context and destory
- 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的更多相关文章
- nosql db and javascript performance
http://blog.csdn.net/yiqijinbu/article/details/9053467 http://blog.nosqlfan.com/tags/javascript http ...
- how to optimize javascript performance
https://developers.google.com/speed/articles/optimizing-javascript http://developer.yahoo.com/perfor ...
- how to measure function performance in javascript
how to measure function performance in javascript Performance API Performance Timeline API Navigatio ...
- 我所知道的Javascript
javascript到了今天,已经不再是我10多年前所认识的小脚本了.最近我也开始用javascript编写复杂的应用,所以觉得有必要将自己的javascript知识梳理一下.同大家一起分享javas ...
- 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 ...
- 转:45 Useful JavaScript Tips, Tricks and Best Practices
原文来自于:http://flippinawesome.org/2013/12/23/45-useful-javascript-tips-tricks-and-best-practices/ 1 – ...
- [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 ...
- JavaScript周报#184
This week’s JavaScript news Read this issue on the Web | Issue Archive JavaScript Weekly Issue 184Ju ...
- Performance js
转贴:https://10up.github.io/Engineering-Best-Practices/javascript/#performance Performance Writing per ...
随机推荐
- MySQL 字符串截取相关函数
MySQL 字符串截取相关函数 在工作中,可能需要将某些字段按某个分割符组成一个字符串作为字段值存取到数据库表中,比如某个任务对应三个结果,分别存储在不同的数据表中,这时可以将这三个不同表的主键按照约 ...
- django构建blog--页面部分(eclipse+pydev)
本文介绍的是在eclipse+pydev 平台下,利用django 搭建blog的第2部分:页面部分(主要涉及3个部分:模板.视图.URL模式) 篇幅1:创建模板 blog目录下新建一个文件夹:tem ...
- python 实现斐波那契数列
def fib(n): a,b=0,1 while a<n: print(a,end=" ") a,b=b,a+b print() fib(2000) 输出: 0 1 1 2 ...
- HDU 5647 DZY Loves Connecting 树形dp
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5647 题解: 令dp[u][0]表示u所在的子树中所有的包含i的集合数,设u的儿子为vi,则易知dp ...
- Facebook 和 Google 如何激发工程师的创造力
原文链接:http://kb.cnblogs.com/page/193450/ 今天终于“朝圣”了两个伟大的公司——Facebook和Google,对创造力和驱动力的来源有了更多的理解,尤其是对于典型 ...
- add some template for ec-final
二维rmq 离线 init O( n*n*logn*logn ) query O(1) http://www.cnblogs.com/kuangbin/p/3227420.html 求1-n有多少个 ...
- CSRF攻击之原理讲解
|=——————————————————————=| |=————–=[ CSRF攻击原理解析 ]=——————=| |=——————————————————————=| |=——————-=[ By ...
- .NET设计模式(5):工厂方法模式(Factory Method)(转)
工厂方法模式(Factory Method) ——.NET设计模式系列之五 Terrylee,2004年1月2日 概述 在软件系统中,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实 ...
- 在centos 6.5 在virtual box 上 安装增强版工具
centos 6.5 在virtual box 上 安装增强版工具: 出现:centos unable to find the source of your current linux kernel ...
- Sqli-labs less 33
Less-33 本关和上一关的payload是一样的 http://127.0.0.1/sqli-labs/Less-33/?id=-1%df%27union%20select%201,user(), ...