createElement与innerHtml性能比較
js中。动态加入html的方法大致就是两种,一种是document.createElement等方法创建,然后使用Element.appendChild加入,或者是使用Element.innerHTML = sHTML的方式。两种方法,显然前面一种更加灵活,除了Element.appendChild方法外,还有insertBefore等等其它dom操作方式。这里且不谈灵活性,但就性能做一个探索。
比較的方式非常easy:
各生成10000次形如<div><span>性能測试</span> ......</div>的html,然后一次性放入body中。记录此全过程,耗时时间,并执行10次,输出耗时。
代码例如以下:
	window.onload = function(){
		testPerformance(10,function(){
			document.body.appendChild(generateHtmlElement(10000));
		})
		testPerformance(10,function(){
			document.body.innerHTML = generateHtmlString(10000);
		})
	}
	function testPerformance(iTimes,fn){
		var iLastTime = null;
		var iTotalTime = 0;
		for(var i=1;i<=iTimes;++i){
			iLastTime = new Date().getTime();
			fn();
			var iCost = new Date().getTime() - iLastTime;
			console.log("第"+i+"次用时:"+iCost+"毫秒");
			iTotalTime+=iCost;
			document.body.innerHTML = "";
			iLastTime = new Date().getTime();
		}
		console.log("总用时:"+iTotalTime+"毫秒");
		console.log("平均用时:"+iTotalTime/iTimes+"毫秒");
	}
	/*
	 *使用document.createElement等dom方法生成元素<div><span>測试性能</span>....<div>
	 *times:生成div的数量
	 *return Element
	 */
	function generateHtmlElement(iTimes){
		var result = document.createElement("div");
		for(var i=0;i<iTimes;++i){
			var eDiv = document.createElement("div");
			for(var j = 0;j<10;++j){
				var eSpan = document.createElement("span");
				eSpan.appendChild(document.createTextNode("測试性能"));
				eDiv.appendChild(eSpan);
			}
			result.appendChild(eDiv);
		}
		return result;
	}
	/*
   *使用字符串拼接的方式生成<div><span>測试性能</span>....<div>字符串
   *times:生成div的数量
   *return string
   */
	function generateHtmlString(iTimes){
		var sb = new StringBuilder ();
		for(var i=0;i<iTimes;++i){
			sb.append("<div>");
			for(var j = 0;j<10;++j){
				sb.append("<span>性能測试</span>");
			}
			sb.append("</div>");
		}
		return sb.toString();
	}
	function StringBuilder () {
     this.__asBuilder = [];
	}
	StringBuilder.prototype.clear = function(){
	     this.__asBuilder = [];//这样的写法要比this.__asBuilder.length = 0稍快,快多少。看数组的长度
	}
	StringBuilder.prototype.append = function(){
	     Array.prototype.push.apply(this.__asBuilder,arguments);//调用Array的push方法,这样调用。使用append,能够传递多个參数
	     return this;//这样能够实现append("a").append()的效果
	}
	StringBuilder.prototype.toString = function(){
	     return this.__asBuilder.join("");
	}
拼接字符串的过程中,使用了一个自己定义类StringBuilder,以提升字符串拼接性能。
測试结果例如以下:
chrome下,差不太多,innerHTML稍好一些:
Firefox中,innerHTML完爆createElement
IE11,应该说,IE11,被chrome和Firefox完爆了
总结一下,单就性能而言,innerHTML都要比createElement创建元素在append进dom中快一些。在IE下。就差的更远了。话说,IE,你怎么这么慢?。我測试方式有问题么?!
createElement与innerHtml性能比較的更多相关文章
- Java中arraylist和linkedlist源代码分析与性能比較
		
Java中arraylist和linkedlist源代码分析与性能比較 1,简单介绍 在java开发中比較经常使用的数据结构是arraylist和linkedlist,本文主要从源代码角度分析arra ...
 - Java里多个Map的性能比較(TreeMap、HashMap、ConcurrentSkipListMap)
		
问题 比較Java原生的 1. TreeMap 2. HashMap 3. ConcurrentSkipListMap 3种Map的效率. 结果 模拟150W以内海量数据的插入和查找,通过添加和 ...
 - Java序列化框架性能比較
		
博客: http://colobu.com jvm-serializers提供了一个非常好的比較各种Java序列化的的測试套件. 它罗列了各种序列化框架. 能够自己主动生成測试报告. 我在AWS c3 ...
 - FlatBuffers与protobuf性能比較
		
FlatBuffers发布时.顺便也发布了它的性能数据,详细数据请见Benchmark. 它的測试用例由下面数据构成"a set of about 10 objects containing ...
 - [轉]redis;mongodb;memcache三者的性能比較
		
先说我自己用的情况: 最先用的memcache ,用于键值对关系的服务器端缓存,用于存储一些常用的不是很大,但需要快速反应的数据 然后,在另一个地方,要用到redis,然后就去研究了下redis. 一 ...
 - java list三种遍历方法性能比較
		
从c/c++语言转向java开发,学习java语言list遍历的三种方法,顺便測试各种遍历方法的性能,測试方法为在ArrayList中插入1千万条记录,然后遍历ArrayList,发现了一个奇怪的现象 ...
 - 作者:wallimn
		
经过这几天对DHTMLXTree的折腾总算是有点眉目了.领导催得紧.组长紧的催. 唉,把握这次机会来好好总结一下DHTMLXTree. 还是老套路.首先来简单了解一下DHTMLXTree. DHTML ...
 - 简单一招实现json数据可视化
		
开发一个内部功能时碰到的需求,要把json数据在页面上展示出来,平时浏览器会安装jsonView这样的扩展来看json数据,但是程序要用到的话该怎么办呢?今天在网上搜索的时候,发现了这个小技巧,分享一 ...
 - 从零开始学习jQuery (三) 管理jQuery包装集
		
本系列文章导航 从零开始学习jQuery (三) 管理jQuery包装集 一.摘要 在使用jQuery选择器获取到jQuery包装集后, 我们需要对其进行操作. 本章首先讲解如何动态的创建元素, 接着 ...
 
随机推荐
- POJ-1190 蛋糕问题
			
这道题目我们使用深搜加剪枝的方法来写,我们首先算出一个最小表面积和最小体积来,就是半径从一递增,高度也从一递增,这是题目要求. 然后我们计算出一个底层最大的半径和最大的高度,我们就从这个最大半径和最大 ...
 - python基础(二)  —— 流程控制语句
			
编程语言中的流程控制语句分为以下几类: 顺序语句 分支语句 循环语句 其中顺序语句不需要单独的关键字来控制,就是按照先后顺序一行一行的执行,不需要特殊的说明. 下面主要是 分支语句 和 循环语句的说明 ...
 - 如何实时查看mysql当前连接数?
			
1.查看当前所有连接的详细资料: ./mysqladmin -uadmin -p -h10.140.1.1 processlist2.只查看当前连接数(Threads就是连接数.): ./mysqla ...
 - luogu3959 宝藏
			
状压搜索轻轻松松就过了--考场上代码太丑了T了几个点 #include <iostream> #include <cstring> #include <cstdio> ...
 - 大数据学习——hive显示命令
			
show databases; desc t_partition001; desc extended t_partition002; desc formatted t_partition002; !c ...
 - zoj 2807 Electrical Outlets
			
Electrical Outlets Time Limit: 2 Seconds Memory Limit: 65536 KB Roy has just moved into a new a ...
 - 公钥加密算法那些事 | RSA 与 ECC 系统对比
			
一.背景 据记载,公元前 400 年,古希腊人发明了置换密码.1881 年世界上的第一个电话保密专利出现.在第二次世界大战期间,德国军方启用「恩尼格玛」密码机,密码学在战争中起着非常重要的作用. 随着 ...
 - Vim  pre-work
			
1.先学会touch typing盲打是一切的基础 重点在于手眼协调 如果实现不了盲打.一切高效率的Vim操作都将无从做起 2.vim的使用 2.1.hjkl的移动 推荐练习贪吃蛇 和3D平衡球 ...
 - isNaN+parseFloat进行统计以及对NaN的处理【JS验证数字】
			
今天遇到这么一个需求: 对数据进行统计,可是在统计的时候parseFloat的时候出来一个NaN.后来用isNaN判断,如果是NaN,就给其设置一个初值. 先看对两个方法的解释 parseFloat: ...
 - msp430项目编程10
			
msp430中项目---电子密码锁 1.扫描键盘工作原理 2.电路原理说明 3.代码(显示部分) 4.代码(功能实现) 5.项目总结 msp430项目编程 msp430入门学习