解析js原生方法创建表格效率测试


Posted in Javascript onJuly 08, 2013

我们先看一下三种算法以及在各种浏览器下的表现。
第一种: 直接操作dom。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>New Web Project</title>
    </head>
    <body>
<script>
microtime = function(get_as_float) {
            var now = new Date().getTime() / 1000;
            var s = parseInt(now, 10);
            return (get_as_float) ? now : (Math.round((now - s) * 1000) / 1000) + ' ' + s;
}
var m1 = microtime(true);
var table = document.createElement("table");
table.border = 1;
var tbody = document.createElement("tbody");
for(var i = 0; i < 1000; i++ ) {
    var tr = document.createElement("tr");
    for(var j = 0; j < 5; j++ ) {
        var td = document.createElement("td");
        td.appendChild(document.createTextNode("cell "+i+","+j));
        tr.appendChild(td);
    }
    tbody.appendChild(tr);
}
table.appendChild(tbody);
//chrome 0.028
//ie6 0.65
//ie7 0.40
//ie8 0.40
//ie9 0.35
//firefox14 0.035
//opera12 0.03
//safari5.17 0.014
document.body.appendChild(table);
var m2 = microtime(true);
alert(m2-m1);
</script>    
    </body>
</html>

第二种,借助借助createDocumentFragment。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>New Web Project</title>
    </head>
    <body>
<script>
microtime = function(get_as_float) {
            var now = new Date().getTime() / 1000;
            var s = parseInt(now, 10);
            return (get_as_float) ? now : (Math.round((now - s) * 1000) / 1000) + ' ' + s;
}
var m1 = microtime(true);
var table = document.createElement("table");
table.border = 1;
var tbody = document.createElement("tbody");
var fragment = document.createDocumentFragment();
for(var i = 0; i < 1000; i++ ) {
    var tr = document.createElement("tr");
    for(var j = 0; j < 5; j++ ) {
        var td = document.createElement("td");
        td.appendChild(document.createTextNode("cell "+i+","+j));
        tr.appendChild(td);
    }
    fragment.appendChild(tr);
}
tbody.appendChild(fragment);
table.appendChild(tbody);
//chrome 0.03
//ie6 0.68
//ie7 0.43
//ie8 0.43
//ie9 0.37
//firefox14 0.03
//opera12 0.04
//safari5.17 0.023
document.body.appendChild(table);
var m2 = microtime(true);
alert(m2-m1);
</script>    
    </body>
</html>

第三种:借助js的原生表格操作方法
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>New Web Project</title>
</head>
<body>
<script>
microtime = function(get_as_float) {
var now = new Date().getTime() / 1000;
var s = parseInt(now, 10);
return (get_as_float) ? now : (Math.round((now - s) * 1000) / 1000) + ' ' + s;
}
var m1 = microtime(true);
var table = document.createElement("table");
table.border = 1;
var tbody = document.createElement("tbody");
table.appendChild(tbody);
for(var i = 0; i < 1000; i++ ) {
tbody.insertRow(i);
for(var j = 0; j < 5; j++ ) {
tbody.rows[i].insertCell(j);
tbody.rows[i].cells[j].appendChild(document.createTextNode("cell "+i+","+j));
}
var tr = document.createElement("tr");
tbody.appendChild(tr);
}
//chrome 0.19
//ie9 0.18
//ie8 0.25
//ie7 8.50
//ie6 20.45
//firefox14 0.065
//opera12 0.25
//safari5.17 0.18
document.body.appendChild(table);
var m2 = microtime(true);
alert(m2-m1);
</script>    
</body>
</html>

以上可以看出用原生的js创建表格效率最好,借助createDocumentFragment优势不是很大(并不像网上说的那么明显),借助insertRow和insertCell等在ie6、7下效率太低,不建议使用。

对第一种算法简单的优化了一下:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>New Web Project</title>
    </head>
    <body>
<script>
microtime = function(get_as_float) {
            var now = new Date().getTime() / 1000;
            var s = parseInt(now, 10);
            return (get_as_float) ? now : (Math.round((now - s) * 1000) / 1000) + ' ' + s;
}
var m1 = microtime(true);
var table = document.createElement("table");
table.border = 1;
var tbody = document.createElement("tbody");
var i = 1000;
while(i--){
    var tr = document.createElement("tr"), j = 5;
    while(j--){
        var td = document.createElement("td");
        td.appendChild(document.createTextNode("cell "+i+","+j));
        tr.appendChild(td);
    }
    tbody.appendChild(tr);
}
table.appendChild(tbody);
//chrome 0.03
//ie6 0.66
//ie7 0.41
//ie8 0.41
//ie9 0.35
//firefox14 0.03
//opera12 0.03
//safari5.17 0.013
document.body.appendChild(table);
var m2 = microtime(true);
alert(m2-m1);
</script>    
    </body>
</html>

总结:对dom操作尽量使用createElement和appendChild,对于js内核提供的一些特殊方法慎用。
Javascript 相关文章推荐
使用Json比用string返回数据更友好,也更面向对象一些
Sep 13 Javascript
用原生JS获取CLASS对象(很简单实用)
Oct 15 Javascript
原生js实现类似弹窗抖动效果
Apr 02 Javascript
node.js回调函数之阻塞调用与非阻塞调用
Nov 13 Javascript
原生JavaScript制作微博发布面板效果
Mar 11 Javascript
网站发布后Bootstrap框架引用woff字体无法正常显示的解决方法
Nov 24 Javascript
mongoose更新对象的两种方法示例比较
Dec 19 Javascript
Vue学习之axios的使用方法实例分析
Jan 06 Javascript
js实现无缝轮播图效果
Mar 09 Javascript
ssm+vue前后端分离框架整合实现(附源码)
Jul 08 Javascript
Ajax实现页面无刷新留言效果
Mar 24 Javascript
Vue+Element UI实现概要小弹窗的全过程
May 30 Vue.js
浅析document.createDocumentFragment()与js效率
Jul 08 #Javascript
如何使用Javascript获取距今n天前的日期
Jul 08 #Javascript
解析使用JS 清空File控件的路径值
Jul 08 #Javascript
使用JS 清空File控件的路径值
Jul 08 #Javascript
JS 修改URL参数(实现代码)
Jul 08 #Javascript
解析javascript系统错误:-1072896658的解决办法
Jul 08 #Javascript
浅谈JavaScript之事件绑定
Jul 08 #Javascript
You might like
php环境配置 php5 mysql5 apache2 phpmyadmin安装与配置
2006/11/17 PHP
用PHP实现Ftp用户的在线管理
2012/02/16 PHP
Laravel5中防止XSS跨站攻击的方法
2016/10/10 PHP
利用PHP获取网站访客的所在地位置
2017/01/18 PHP
可以支持多中格式的JS键盘
2007/05/02 Javascript
jquery HotKeys轻松搞定键盘事件代码
2008/08/30 Javascript
jQuery ctrl+Enter shift+Enter实现代码
2010/02/07 Javascript
jQuery之日期选择器的深入解析
2013/06/19 Javascript
javascript里使用php代码实例
2014/12/13 Javascript
用js判断是否为360浏览器的实现代码
2015/01/15 Javascript
JavaScript中的fontsize()方法使用详解
2015/06/08 Javascript
JavaScript中removeChild 方法开发示例代码
2016/08/15 Javascript
微信小程序 配置文件详细介绍
2016/12/14 Javascript
jQuery仿IOS弹出框插件
2017/02/18 Javascript
JavaScript闭包和回调详解
2017/08/09 Javascript
js 获取json数组里面数组的长度实例
2017/10/31 Javascript
详解vue-cli 接口代理配置
2017/12/13 Javascript
vue iView 上传组件之手动上传功能
2018/03/16 Javascript
详解vue-cli脚手架中webpack配置方法
2018/08/22 Javascript
JS猜数字游戏实例讲解
2020/06/30 Javascript
[06:15]2016国际邀请赛中国区预选赛单车采访:我顶WINGS
2016/06/27 DOTA
Python基于time模块求程序运行时间的方法
2017/09/18 Python
树莓派与PC端在局域网内运用python实现即时通讯
2019/06/22 Python
Python Numpy 实现交换两行和两列的方法
2019/06/26 Python
flask利用flask-wtf验证上传的文件的方法
2020/01/17 Python
Python文件操作方法详解
2020/02/09 Python
python使用hdfs3模块对hdfs进行操作详解
2020/06/06 Python
解决margin 外边距合并问题
2019/07/03 HTML / CSS
科沃斯机器人官网商城:Ecovacs
2016/08/29 全球购物
加拿大女装网上购物:Reitmans
2016/10/20 全球购物
马来西亚航空官方网站:Malaysia Airlines
2017/07/28 全球购物
京东奢侈品:全球奢侈品牌
2018/03/17 全球购物
Michael Kors英国官网:美国奢侈品品牌
2019/11/13 全球购物
ASICS印度官方网站:日本专业运动品牌
2020/06/20 全球购物
主要领导对照检查材料
2014/08/26 职场文书
实习报告范文之电话客服岗位
2019/07/26 职场文书