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,你怎么这么慢?。我測试方式有问题么?!

时间: 2024-08-10 21:21:41

createElement与innerHtml性能比較的相关文章

Java中arraylist和linkedlist源代码分析与性能比較

Java中arraylist和linkedlist源代码分析与性能比較 1,简单介绍 在java开发中比較经常使用的数据结构是arraylist和linkedlist,本文主要从源代码角度分析arraylist和linkedlist的性能. 2,arraylist源代码分析 Arraylist底层的数据结构是一个对象数组.有一个size的成员变量标记数组中元素的个数,例如以下图: * The array buffer into which the elements of the ArrayLis

Java里多个Map的性能比較(TreeMap、HashMap、ConcurrentSkipListMap)

问题 比較Java原生的 1.  TreeMap 2.  HashMap 3.  ConcurrentSkipListMap 3种Map的效率. 结果 模拟150W以内海量数据的插入和查找,通过添加和查找双方面的性能測试,结果例如以下: Map类型 插入 查找(在100W数据量中)   10W 50W 100W 150W 0-1W 0-25W 0-50W ConcurrentSkipListMap 62 ms 227 ms 433 ms 689ms 7 ms 80 ms 119 ms HashM

[轉]redis;mongodb;memcache三者的性能比較

先说我自己用的情况: 最先用的memcache ,用于键值对关系的服务器端缓存,用于存储一些常用的不是很大,但需要快速反应的数据 然后,在另一个地方,要用到redis,然后就去研究了下redis. 一看,显示自己安装了php扩展,因为有服务器上的redis服务端,自己本地就没有安装,其实用法和memcache基本一样,可能就是几个参数有所不 同.当然 它们缓存的效果也不一样,具体的哪里不一样,一下就是一些资料,和自己的总结 1. Redis和Memcache都是将数据存放在内存中,都是内存数据库

createElement与innerHtml性能比较

js中,动态添加html的方法大致就是两种,一种是document.createElement等方法创建,然后使用Element.appendChild添加,或者是使用Element.innerHTML = sHTML的方式.两种方法,显然前面一种更加灵活,除了Element.appendChild方法外,还有insertBefore等等其他dom操作方式.这里且不谈灵活性,但就性能做一个探索. 比较的方式很简单: 各生成10000次形如<div><span>性能测试</sp

java list三种遍历方法性能比較

从c/c++语言转向java开发,学习java语言list遍历的三种方法,顺便測试各种遍历方法的性能,測试方法为在ArrayList中插入1千万条记录,然后遍历ArrayList,发现了一个奇怪的现象,測试代码例如以下: package com.hisense.tiger.list; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class ListTest { publi

配置管理工具比較

配置管理工具比較    怎样选择配置管理工具     每一个软件项目,不管是project类项目,还是产品类项目,都必须经历需求分析.系统设计.编码实现.集成測试.部署.交付.维护和支持的过程.在这个过程中,将生成各种各样不同的工件,包含文档.源程序.可执行代码.支持库.更可怕的是,频繁出现的变更是不可避免的,因此面向如此庞大且不断变动的信息集,怎样使其有序.高效地存放.查找和利用就成为了一个突出的问题.     针对这一问题,最早的开发者尝试过的解决的方法是通过手工来实现:     1)文档:

高并发电子商务平台技术架构

原文出自:http://blog.csdn.net/yangbutao/article/details/12242441 http://stamen.iteye.com/blog/1525924 我自己的大型B2B和B2C站点原来也是用Hibernate,可是后来不得不换成mybatis, 第一是用Hibernate 因为它封装得太高了.非常多东西是隐式进行的.常常引起问题,非常难定位.毕竟凡事有利必有弊: 第二大型站点肯定不是一个数据库.这点Hibernate是非常麻烦的,用Jdbc或Myba

Shell脚本中替换字符串等操作

在做shell批处理程序时候,常常会涉及到字符串相关操作. 有非常多命令语句.如:awk,sed都能够做字符串各种操作. 事实上shell内置一系列操作符号.能够达到类似效果,大家知道,使用内部操作符会省略启动外部程序等时间,因此速度会非常的快. 一.推断读取字符串值 表达式 含义 ${var} 变量var的值, 与$var同样     ${var-DEFAULT} 假设var没有被声明, 那么就以$DEFAULT作为其值 * ${var:-DEFAULT} 假设var没有被声明, 或者其值为空

iOS_中国汉字到拼音_pinyin4objc

最后效果图: ViewController.h // // ViewController.h // PinYin4Objc汉字转拼音演示demo // // Created by beyond on 14-7-26. // Copyright (c) 2014年 com.beyond. All rights reserved. // #import <UIKit/UIKit.h> @interface ViewController : UIViewController // 输入框 @prop