关于Javascript循环体变量声明与初始化的效率问题
针对循环体变量声明与初始化的效率问题,将执行的简单测试代码如下:
function test(n) {
console.time('Internally initialized');
for (var i = 0; i < n; i++) {
let a = i;
}
console.timeEnd('Internally initialized');
console.time('Externally initialized');
let a = 0;
for (var i = 0; i < n; i++) {
a = i;
}
console.timeEnd('Externally initialized');
console.time('Externally declared');
let b;
for (var i = 0; i < n; i++) {
b = i;
}
console.timeEnd('Externally declared');
}
Chromium 58.0.3029.110下的测试结果,没有考虑更多的测试条件、环境因素影响等等:
test(1000000000) Script snippet #2:6 Internally initialized: 2894.2080078125ms Script snippet #2:13 Externally initialized: 2867.099853515625ms Script snippet #2:20 Externally declared: 2895.260986328125ms undefined test(100000000) Script snippet #2:6 Internally initialized: 355.6640625ms Script snippet #2:13 Externally initialized: 296.761962890625ms Script snippet #2:20 Externally declared: 296.949951171875ms undefined test(10000000) Script snippet #2:6 Internally initialized: 68.672119140625ms Script snippet #2:13 Externally initialized: 43.97705078125ms Script snippet #2:20 Externally declared: 35.217041015625ms undefined test(1000000) Script snippet #2:6 Internally initialized: 12.23388671875ms Script snippet #2:13 Externally initialized: 10.057861328125ms Script snippet #2:20 Externally declared: 8.0849609375ms undefined test(100000) Script snippet #2:6 Internally initialized: 0.94873046875ms Script snippet #2:13 Externally initialized: 1.088134765625ms Script snippet #2:20 Externally declared: 0.931884765625ms undefined test(10000) Script snippet #2:6 Internally initialized: 0.1181640625ms Script snippet #2:13 Externally initialized: 0.176025390625ms Script snippet #2:20 Externally declared: 0.145751953125ms undefined test(1000) Script snippet #2:6 Internally initialized: 0.044921875ms Script snippet #2:13 Externally initialized: 0.04296875ms Script snippet #2:20 Externally declared: 0.046875ms undefined test(100) Script snippet #2:6 Internally initialized: 0.025146484375ms Script snippet #2:13 Externally initialized: 0.033935546875ms Script snippet #2:20 Externally declared: 0.02783203125ms undefined test(10) Script snippet #2:6 Internally initialized: 0.024169921875ms Script snippet #2:13 Externally initialized: 0.024169921875ms Script snippet #2:20 Externally declared: 0.02197265625ms undefined test(1) Script snippet #2:6 Internally initialized: 0.02490234375ms Script snippet #2:13 Externally initialized: 0.032958984375ms Script snippet #2:20 Externally declared: 0.030029296875ms undefined
Firefox 54.0下的测试结果,没有考虑更多的测试条件、环境因素影响等等:
test(1000000000) Internally initialized: 计时器开始 Internally initialized: 768.81ms Externally initialized: 计时器开始 Externally initialized: 697.8ms Externally declared: 计时器开始 Externally declared: 704.16ms undefined test(100000000) Internally initialized: 计时器开始 Internally initialized: 131.84ms Externally initialized: 计时器开始 Externally initialized: 84.42ms Externally declared: 计时器开始 Externally declared: 70.98ms undefined test(10000000) Internally initialized: 计时器开始 Internally initialized: 19.92ms Externally initialized: 计时器开始 Externally initialized: 17.09ms Externally declared: 计时器开始 Externally declared: 15.33ms undefined test(1000000) Internally initialized: 计时器开始 Internally initialized: 3.46ms Externally initialized: 计时器开始 Externally initialized: 3.06ms Externally declared: 计时器开始 Externally declared: 2.75ms undefined test(100000) Internally initialized: 计时器开始 Internally initialized: 1.49ms Externally initialized: 计时器开始 Externally initialized: 1.11ms Externally declared: 计时器开始 Externally declared: 2.14ms undefined test(10000) Internally initialized: 计时器开始 Internally initialized: 1.03ms Externally initialized: 计时器开始 Externally initialized: 1.11ms Externally declared: 计时器开始 Externally declared: 1.11ms undefined test(1000) Internally initialized: 计时器开始 Internally initialized: 1.25ms Externally initialized: 计时器开始 Externally initialized: 0.84ms Externally declared: 计时器开始 Externally declared: 0.82ms undefined test(100) Internally initialized: 计时器开始 Internally initialized: 1.29ms Externally initialized: 计时器开始 Externally initialized: 1.02ms Externally declared: 计时器开始 Externally declared: 1.21ms undefined test(10) Internally initialized: 计时器开始 Internally initialized: 1.29ms Externally initialized: 计时器开始 Externally initialized: 1.1ms Externally declared: 计时器开始 Externally declared: 1.64ms undefined test(1) Internally initialized: 计时器开始 Internally initialized: 1.15ms Externally initialized: 计时器开始 Externally initialized: 0.97ms Externally declared: 计时器开始 Externally declared: 0.89ms undefined
三种方式无明显差别。从一般性逻辑来分析,声明和初始化是两种操作,其中任何一种操作发生的次数越多耗时越多;但变量声明时就及时初始化是个好的编程习惯,未初始化的变量就直接参与运算常常会得到意想不到的结果,如(undefined) + 1 = NaN、(undefined) + 'string' = "undefinedstring",当然很多编程语言对于未初始化的变量以默认类型值初始化,而Javascript默认值为undefined。另外,这里不探讨存储性能和垃圾回收机制。
关于Javascript循环体变量声明与初始化的效率问题的更多相关文章
- JavaScript中变量声明有var和没var的区别
JavaScript中变量声明有var和没var的区别 JavaScript中有var和没var的区别 Js中的变量声明的作用域是以函数为单位,所以我们经常见到避免全局变量污染的方法是 (functi ...
- javascript的变量声明、数据类型
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- JavaScript 基础 (变量声明, 数据类型, 控制语句)
创建: 2017/09/16 更新: 2017/09/24 更改标题 [JavaScript 概要]-> [JavaScript 基础] 完成: 2017/09/25 更新: 2017/10/0 ...
- javascript的变量声明和数据类型
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- JavaScript中变量声明以及数据类型
JavaScript变量 变量名必须以字母或下划线("_")开头 变量也能以 $ 和 _ 符号开头(不过我们不推荐这么做) 变量名称对大小写敏感(y 和 Y 是不同的变量) 变量可 ...
- 【C++】const,static和static const类型成员变量声明及其初始化
1)const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间 void f1() { ; cout<<x<<endl; ...
- C++ static、const和static const类型成员变量声明以及初始化
C++ static.const和static const 以及它们的初始化 const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间. sta ...
- javascript:变量声明&&赋值的提升和函数声明&&定义的提升在不同情况下的表现
console.log(a); //undefined console.log(show); //函数的定义 show(); //aaa123 var a = 1; function ...
- JavaScript中变量声明效率问题
1 var theString1 = "字符串1"; var theString2 = "字符串1"; var theString3 = "字符串1& ...
随机推荐
- hdu1054最小顶点覆盖
最小定点覆盖是指这样一种情况: 图G的顶点覆盖是一个顶点集合V,使得G中的每一条边都接触V中的至少一个顶点.我们称集合V覆盖了G的边.最小顶点覆盖是用最少的顶点来覆盖所有的边.顶点覆盖数是最小顶点覆盖 ...
- 一个栗子上手CSS3动画
最近杂七杂八的事情很多,很多知识都没来得及总结,是时候总结总结,开启新的篇章- 本篇文章不一一列举CSS3动画的属性,若需要了解API,可前往MDN 在开始栗子前,我们先补补基础知识. css3动画分 ...
- Java内存模型四
volatile的特性 当我们声明共享变量为volatile后,对这个变量的读/写将会很特别.理解volatile特性的一个好方法是:把对volatile变量的单个读/写,看成是使用同一个锁对这些单个 ...
- ScheduledFuture和RunnableScheduledFuture详解
ScheduledFuture java.util.concurrent 接口 ScheduledFuture<V> 类型参数: V - 此 Future 返回的结果类型. 所 ...
- JAVA并发编程实战---第三章:对象的共享(2)
线程封闭 如果仅仅在单线程内访问数据,就不需要同步,这种技术被称为线程封闭,它是实现线程安全性的最简单的方式之一.当某个对象封闭在一个线程中时,这种方法将自动实现线程安全性,即使被封闭的对象本生不是线 ...
- System.load 与 System.loadLibrary 的使用
相同点 它们都可以用来装载库文件,不论是JNI库文件还是非JNI库文件. 在任何本地方法被调用之前必须先用这个两个方法之一把相应的JNI库文件装载. System.load System.load 参 ...
- dubbo在企业中用得多吗?
看了阿里的dubbo,据说是一个不错的服务框架, 不过,好像Minglisoft.technology搞研发希望各位可以指点学习 想知道其他的公司用这个框架多吗?遇到的问题能否快速解决呢?抉择中...
- SQL SERVER大话存储结构(3)_数据行的行结构
一行数据是如何来存储的呢? 变长列与定长列,NULL与NOT NULL,实际是如何整理存放到 8k的数据页上呢? 对表格进行增减列,修改长度,添加默认值等DDL SQL ...
- Java 脚本化编程指南
Java 脚本化编程指南 Java脚本化API为谁准备? 脚本语言的一些有用的特性是: 方便:大多数脚本语言都是动态类型的.您通常可以创建新的变量,而不声明变量类型,并且您可以重用变量来存储不同类型的 ...
- 【JAVAWEB学习笔记】27_Redis:在Linux上的安装、Jedis和常用命令
一.Redis简介 1.关于关系型数据库和nosql数据库 关系型数据库是基于关系表的数据库,最终会将数据持久化到磁盘上,而nosql数据 库是基于特殊的结构,并将数据存储到内存的数据库.从性 ...