浅谈JavaScript性能
最近在JavaScript性能方面有所感悟,把我的经验分给大家:
说到JavaScript,就不得不说它的代码的运行速度——
在我初学JavaScript的时候,只是觉得它是一个很强大的脚本。渐渐的,在做一些大的网站的项目的时候,却发现,代码执行的却异常的慢(尽管JavaScript用的是V8引擎),任然不能满足我的需求。这时候,我才慢慢的关注性能这一名词。在以前,个人总是喜欢在网上搜一些好的插件,并把它用到网站的建设工作当中。那么问题来了,在大量的插件的使用当中,网页总是要运行很久,处于很长时间的空白,这时候我发现JavaScript执行代码的速度越来越慢。究其缘由,那就是网页在渲染的过程前,一直在执行JavaScript代码的编译,以至于让网页长时间处于空白状态。那么这种问题的来源是什么?怎么解决呢?
在引用<script>标签的时候,我们习惯性的把它放在<head>标签之内。这样的做法,只是在最初接触JavaScript,或者说小的项目的时候可以这样做。个人觉得,做网页就是要很好的实现与用户的交互,如果像上述过程一样,用户长时间看的是一片空白的页面,会导致什么样的后果可想而知。为了提高JavaScript代码编译的运行速度,提升JavaScript的性能,(1)我推荐把<script>标签写在</body>之前,如果有很多的js,我建议用把包工具(雅虎YUI)合并一下.(2)在IE4+ Firefox3.5 的版本下,用代有defer的属性,像这样:<script defer></script> ,这样做的原理是让<script>标签总在onload事件执行前调用,原因不用深究。(3)动态的创建JavaScript (有兴趣的可以试试,不推荐)。
下面说到一个很实用,又简单,提升JavaScript性能的方法:‘局部变量’
这里必须要说一下在JavaScript里面,有四种数据存取位置:1.直接量 2.变量 3.数组元素 4.对象成员。
通常来讲,我们可以通过把常用的对象成员、数组元素、跨域变量保存在局部变量中来改善JavaScript性能,因为局部变量访问的速度更快。为了便于理解,还是敲两段代码吧!
function myLoop1(){
for(var count=0;count<99999;count++){
$('#idName').innerHTML + = 'A';
}
}
说明一下这段代码:每一次循环访问id是idName的元素时,该元素一共被访问了两次,一次是读取他的innerHTML,另一次是重写idName的值。
那么怎么才算提升性能的做法呢?看如下代码
function myLoop2(){
var show='';
for(var count=0;count<99999;count++){
show+ = 'A';
}
$('#idName').innerHTML += show;
}
实验证明:在所有浏览器下,myLoop2的运行要比myLoop1,快几十倍,在IE6下,更是快155呗。
那么为什么这样做会快这么多呢。我简单解释一下:JavaScript实际上包括了ECMAScript、DOM、BOM,不要以为三者是和谐共处的,它们互相沟通可是要过“路费的”。所以,我们要尽可能的把运算留给ECMAScript这一端,减少访问DOM的次数。
以后还有性能方面的问题还会分享给大家,不喜勿喷哦!
浅谈JavaScript性能的更多相关文章
- 浅谈javascript性能-管理内存
上次说到,javascript脚本到底应该放在哪里?用什么用处? 以下2点: 在Html.Body部分中的JS会在页面加载的时候执行.即-用户触发一个事件的时候执行的脚本.eg:onload事件... ...
- 浅谈javascript函数节流
浅谈javascript函数节流 什么是函数节流? 函数节流简单的来说就是不想让该函数在很短的时间内连续被调用,比如我们最常见的是窗口缩放的时候,经常会执行一些其他的操作函数,比如发一个ajax请求等 ...
- 浅谈DOM性能考虑
浅谈DOM性能考虑 很多人都会忽视脚本对Web应用整体性能的影响.为保证应用的流畅运行,在为文档编写和应用脚本时,需要注意一些问题.一.尽量减少访问DOM和尽量减少标记 访问DOM的方式对脚本性 ...
- 浅谈javascript的原型及原型链
浅谈javascript的原型及原型链 这里,我们列出原型的几个概念,如下: prototype属性 [[prototype]] __proto__ prototype属性 只要创建了一个函数,就会为 ...
- 浅谈java性能分析
浅谈java性能分析,效能分析 在老师强烈的要求下做了效能分析,对上次写过的词频统计的程序进行分析以及改进. 对于效能分析:我个人很浅显的认为就是程序的运行效率,代码的执行效率等等. java做性能测 ...
- 浅谈JavaScript中的闭包
浅谈JavaScript中的闭包 在JavaScript中,闭包是指这样一个函数:它有权访问另一个函数作用域中的变量. 创建一个闭包的常用的方式:在一个函数内部创建另一个函数. 比如: functio ...
- 浅谈JavaScript浮点数及其运算
原文:浅谈JavaScript浮点数及其运算 JavaScript 只有一种数字类型 Number,而且在Javascript中所有的数字都是以IEEE-754标准格式表示的.浮点数的精度问题 ...
- 浅谈 JavaScript 编程语言的编码规范
对于熟悉 C/C++ 或 Java 语言的工程师来说,JavaScript 显得灵活,简单易懂,对代码的格式的要求也相对松散.很容易学习,并运用到自己的代码中.也正因为这样,JavaScript 的编 ...
- 浅谈JavaScript中的null和undefined
浅谈JavaScript中的null和undefined null null是JavaScript中的关键字,表示一个特殊值,常用来描述"空值". 对null进行typeof类型运 ...
随机推荐
- Java中关于OOM的场景及解决方法(转)
http://developer.51cto.com/art/201112/305696.htm 1.OOM for Heap=>例如:java.lang.OutOfMemoryError: J ...
- 大约cocos2d-X 3.x使用引擎版本自带的物理引擎Physics
今天打算用BOX2D物理引擎, 我想我以前听说过一些时间cocos2d-X在3.0版本封装自己的物理引擎Physics, 听名字很霸气量, 这的确是一个比BOX2D非常多( 毕竟是基于BOX2D封装的 ...
- Java读书笔记三(字符串)
1.介绍 本篇博客将对JAVA中的字符串类的基本知识进行介绍.主要字符串类的一些经常用法等内容. 2.字符串对象的创建 1.有两种形式.可是在开发中常常习惯于String 变量名的形式来进行操作. & ...
- JUnit使用参数测试和一组测试
JUnit该参数测试和一组测试使用简单 参数测试 作为替代阵列int a0,a1,a2喜欢,当测试加法assertEquals(3.0, h.add(1, 2), 0.1);相当于声明一个变量,要測试 ...
- Cocos2d-x3.0 DrawNode吸取
DrawNode正如它的绘图形状的节点,相互作用可以使将来更加灵活. DrawNode* DrawLayer::shape() { auto shape = DrawNode::create(); s ...
- 备忘录模式设计模式入门Memento
//备忘录模式定义: //在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态. //这样以后就能够将该对象恢复到原先保存的状态 //实例:測试两种方案.两种方案在第一阶段的过程 ...
- 使用javascript实现html文字不可选
如何使用js让html该文本是不可选定它?首先想到的是用css选择实现,如下面: -webkit-touch-callout: none; -webkit-user-select: none; -kh ...
- Flux是一个Facebook团队的前端开发架构
Flux是一个Facebook团队的前端开发架构 Flux introduction 本文组成: React 官方文档翻译 相关实践心得. 内容上是Flux的介绍,例子将会在以后写出.一旦稍微多了解一 ...
- (大数据工程师学习路径)第一步 Linux 基础入门----环境变量与文件查找
环境变量与文件查找 本节介绍环境变量的作用与用法,及几种搜索文件的方法.学会这些技巧高效地使用 Linux. 一.环境变量 1.变量 要解释环境变量,得先明白变量是什么,准确的说应该是 Shell 变 ...
- hdu2844 & poj1742 Coin ---多重背包--两种方法
意甲冠军:你有N种硬币,每个价格值A[i],每个号码C[i],要求. 在不超过M如果是,我们用这些硬币,有多少种付款的情况下,.那是,:1,2,3,4,5,....,M这么多的情况下,,你可以用你的硬 ...