使用Javascript动态创建表格,不同的方法,巨大的运行时间差异!

本来是想测试一下使用Javascript生成一个比较大的表格,大概需要多长时间,一直认为这会是一个比较固定的时间。期间用了几种不同的方法,发现效率相差太大了。下面是测试的具体说明:

目标:生成一个2000*5的表格,每个单元格的内容是行号+逗号+列号

方法一:使用createElement生成表格,使用insertRow和insertCell方法生成行列,单元格的内容使用innerHTML属性进行填充。

方法二:使用createElement生成表格,使用CreateElement方法生成行列,单元格的内容使用了createTextNode方法填充。

方法三:拼接表格innerHTML属性的字符串,使用字符串 += 操作符链接字符串

方法四:拼接表格innerHTML属性的字符串,各个字符串追加数组里面,最后调用数组的join方法生成目标字符串。

运行时间比较:

方法 运行时间(ms)
方法一 93037
方法二 3341
方法三 2795
方法四 500

具体的程序如下:

<html>
<head>

<title>test page</title>

<script type=’text/javascript’>

<!–

function createTable() {

var t = document.createElement(‘table’);

for (var i = 0; i < 2000; i++) {

var r = t.insertRow(0);

for (var j = 0; j < 5; j++) {

var c = r.insertCell(0);

c.innerHTML = i + ‘,’ + j;

}

}

document.getElementById(‘table1′).appendChild(t);

t.setAttribute(‘border’, ’1′);

}

function createTable2() {

var t = document.createElement(‘table’);

var b = document.createElement(‘tbody’);

for (var i = 0; i < 2000; i++) {

var r = document.createElement(‘tr’);

for (var j = 0; j < 5; j++) {

var c = document.createElement(‘td’);

var m = document.createTextNode(i + ‘,’ + j);

c.appendChild(m);

r.appendChild(c);

}

b.appendChild(r);

}

t.appendChild(b);

document.getElementById(‘table1′).appendChild(t);

t.setAttribute(‘border’, ’1′);

}

function createTable3() {

var data = ”;

data += ‘<table border=1><tbody>’;

for (var i = 0; i < 2000; i++) {

data += ‘<tr>’;

for (var j = 0; j < 5; j++) {

data += ‘<td>’ + i + ‘,’ + j + ‘</td>’;

}

data += ‘</tr>’;

}

data += ‘</tbody><table>’;

document.getElementById(‘table1′).innerHTML = data;

}

function createTable4() {

var data = new Array();

data.push(‘<table border=1><tbody>’);

for (var i = 0; i < 2000; i++) {

data.push(‘<tr>’);

for (var j = 0; j < 5; j++) {

data.push(‘<td>’ + i + ‘,’ + j + ‘</td>’);

}

data.push(‘</tr>’);

}

data.push(‘</tbody><table>’);

document.getElementById(‘table1′).innerHTML = data.join(”);

}

function showFunctionRunTime(f) {

var t1 = new Date();

f();

var t2 = new Date();

alert(t2 – t1);

}

//–>

</script>
</head>
<body>

<div id=”table1″ style=”border: 1px solid black”>

</div>

<script>

showFunctionRunTime(createTable);

showFunctionRunTime(createTable2);

showFunctionRunTime(createTable3);

showFunctionRunTime(createTable4);

</script>
</body>
</html>

————————————————————————

PS: 2009-12-05,后续的测试请查看这里

4 Responses

Subscribe to comments with RSS.

  • tunpishuang says:

    能解释一下为啥我自己写的例子,首先输出1999,4
    最后是0,0

  • dofy says:

    Chrome 里都差不多都在 200 以内, ff 没反应…

  • jasson says:

    很好的示例

  • ai2ming says:

    该评论来自:http://abaper.blogbus.com/logs/52974851.html<br />
    <div class="quote">
    <p>此篇文章为《使用Javascript动态创建表格,不同的方法,巨大的运行时间差异!》的继续讨论,原文章地址为:<a href="http://abaper.blogbus.com/logs/8278500.html">http://abaper.blogbus.com/logs/8278500.html</a></p&gt;
    <p><strong>目标:</strong>生成一个2000*5的表格,每个单元格的内容是行号+逗号+列号 </p>
    <p>方法一:使用createElement生成表格,使用insertRow和insertCell方法生成行列,单元格的内容使用innerHTML属性进行填充。 </p>
    <p>方法二:使用createElement生成表格,使用CreateElement方法生成行列,单元格的内容使用了createTextNode方法填充。 </p>
    <p>方法三:拼接表格innerHTML属性的字符串,使用字符串 += 操作符链接字符串 </p>
    <p>方法四:拼接表格innerHTML属性的字符串,各个字符串追加数组里面,最后调用数组的join方法生成目标字符串。 </p>
    <p>根据dofy网友的反馈,重新做了测试。</p>
    <p>ff下没有反映是因为有脚本错误,insertRow,insertCell两个方法在ff中必须带参数,我已经修改了原来的测试代码。</p>
    <p>对我本机有环境的几个浏览器进行了重新测试,结果如下:</p>
    <p>
    <table style="width: 294pt; border-collapse: collapse;" border="0" cellspacing="0" cellpadding="0" width="392">
    <colgroup span="1"><col style="width: 102pt; mso-width-source: userset; mso-width-alt: 4973;" span="1" width="136"></col><col style="width: 48pt;" span="4" width="64"></col></colgroup>
    <tbody>
    <tr style="height: 20.1pt; mso-height-source: userset;" height="26">
    <td class="xl22" style="width: 102pt; height: 20.1pt; background-color: transparent; border: windowtext 0.5pt solid;" width="136" height="26"><span style="font-size: x-small; font-family: 宋体;">浏览器</span></td>
    <td class="xl22" style="border-right: windowtext 0.5pt solid; border-top: windowtext 0.5pt solid; border-left: windowtext; width: 48pt; border-bottom: windowtext 0.5pt solid; background-color: transparent;" width="64"><span style="font-size: x-small; font-family: 宋体;">方法一</span></td>
    <td class="xl22" style="border-right: windowtext 0.5pt solid; border-top: windowtext 0.5pt solid; border-left: windowtext; width: 48pt; border-bottom: windowtext 0.5pt solid; background-color: transparent;" width="64"><span style="font-size: x-small; font-family: 宋体;">方法二</span></td>
    <td class="xl22" style="border-right: windowtext 0.5pt solid; border-top: windowtext 0.5pt solid; border-left: windowtext; width: 48pt; border-bottom: windowtext 0.5pt solid; background-color: transparent;" width="64"><span style="font-size: x-small; font-family: 宋体;">方法三</span></td>
    <td class="xl22" style="border-right: windowtext 0.5pt solid; border-top: windowtext 0.5pt solid; border-left: windowtext; width: 48pt; border-bottom: windowtext 0.5pt solid; background-color: transparent;" width="64"><span style="font-size: x-small; font-family: 宋体;">方法四</span></td>
    </tr>
    <tr style="height: 20.1pt; mso-height-source: userset;" height="26">
    <td class="xl22" style="border-right: windowtext 0.5pt solid; border-top: windowtext; border-left: windowtext 0.5pt solid; border-bottom: windowtext 0.5pt solid; height: 20.1pt; background-color: transparent;" height="26"><span style="font-size: x-small; font-family: 宋体;">IE 7</span></td>
    <td class="xl22" style="border-right: windowtext 0.5pt solid; border-top: windowtext; border-left: windowtext; border-bottom: windowtext 0.5pt solid; background-color: transparent;" align="right"><span style="font-size: x-small; font-family: 宋体;">31503</span></td>
    <td class="xl22" style="border-right: windowtext 0.5pt solid; border-top: windowtext; border-left: windowtext; border-bottom: windowtext 0.5pt solid; background-color: transparent;" align="right"><span style="font-size: x-small; font-family: 宋体;">1749</span></td>
    <td class="xl22" style="border-right: windowtext 0.5pt solid; border-top: windowtext; border-left: windowtext; border-bottom: windowtext 0.5pt solid; background-color: transparent;" align="right"><span style="font-size: x-small; font-family: 宋体;">6713</span></td>
    <td class="xl22" style="border-right: windowtext 0.5pt solid; border-top: windowtext; border-left: windowtext; border-bottom: windowtext 0.5pt solid; background-color: transparent;" align="right"><span style="font-size: x-small; font-family: 宋体;">312</span></td>
    </tr>
    <tr style="height: 20.1pt; mso-height-source: userset;" height="26">
    <td class="xl22" style="border-right: windowtext 0.5pt solid; border-top: windowtext; border-left: windowtext 0.5pt solid; border-bottom: windowtext 0.5pt solid; height: 20.1pt; background-color: transparent;" height="26"><span style="font-size: x-small; font-family: 宋体;">FF 3.0.10</span></td>
    <td class="xl22" style="border-right: windowtext 0.5pt solid; border-top: windowtext; border-left: windowtext; border-bottom: windowtext 0.5pt solid; background-color: transparent;" align="right"><span style="font-size: x-small; font-family: 宋体;">1128</span></td>
    <td class="xl22" style="border-right: windowtext 0.5pt solid; border-top: windowtext; border-left: windowtext; border-bottom: windowtext 0.5pt solid; background-color: transparent;" align="right"><span style="font-size: x-small; font-family: 宋体;">470</span></td>
    <td class="xl22" style="border-right: windowtext 0.5pt solid; border-top: windowtext; border-left: windowtext; border-bottom: windowtext 0.5pt solid; background-color: transparent;" align="right"><span style="font-size: x-small; font-family: 宋体;">277</span></td>
    <td class="xl22" style="border-right: windowtext 0.5pt solid; border-top: windowtext; border-left: windowtext; border-bottom: windowtext 0.5pt solid; background-color: transparent;" align="right"><span style="font-size: x-small; font-family: 宋体;">224</span></td>
    </tr>
    <tr style="height: 20.1pt; mso-height-source: userset;" height="26">
    <td class="xl22" style="border-right: windowtext 0.5pt solid; border-top: windowtext; border-left: windowtext 0.5pt solid; border-bottom: windowtext 0.5pt solid; height: 20.1pt; background-color: transparent;" height="26"><span style="font-size: x-small; font-family: 宋体;">chrome 3.0.195.33</span></td>
    <td class="xl22" style="border-right: windowtext 0.5pt solid; border-top: windowtext; border-left: windowtext; border-bottom: windowtext 0.5pt solid; background-color: transparent;" align="right"><span style="font-size: x-small; font-family: 宋体;">154</span></td>
    <td class="xl22" style="border-right: windowtext 0.5pt solid; border-top: windowtext; border-left: windowtext; border-bottom: windowtext 0.5pt solid; background-color: transparent;" align="right"><span style="font-size: x-small; font-family: 宋体;">87</span></td>
    <td class="xl22" style="border-right: windowtext 0.5pt solid; border-top: windowtext; border-left: windowtext; border-bottom: windowtext 0.5pt solid; background-color: transparent;" align="right"><span style="font-size: x-small; font-family: 宋体;">157</span></td>
    <td class="xl22" style="border-right: windowtext 0.5pt solid; border-top: windowtext; border-left: windowtext; border-bottom: windowtext 0.5pt solid; background-color: transparent;" align="right"><span style="font-size: x-small; font-family: 宋体;">185</span></td>
    </tr>
    </tbody>
    </table>
    </p>
    </div>
    <div>测试结果总结:</div>
    <div>1、对方法一中使用标准DOM对表格操作方法的支持中,IE7的性能最差。</div>
    <div>2、ff 3和chrome 3对字符串的&ldquo;+&rdquo;操作都做了优化,在chrome下面&ldquo;+&rdquo;操作的性能甚至比array.join()还好,这点是我没有想到的。和在Java中虚拟机对&ldquo;+&rdquo;操作的优化类似,我感觉以后以牺牲代码可读性进行优化的必要性变得越来越小。</div>
    <div>3、chrome的性能确实很强,尤其是对方法二使用的createElement类方法的支持。</div>