使用javascript构建表
我试图理解为什么在Firefox43.0.2上使用javascript重建一个表需要这么长时间 下面是我的代码的简化版本。“真实”代码和简单版本都使用“publishTable()向表中添加行。publishTable删除一个表体元素(如果存在),创建一个新的表体元素,向其添加约9000行,并将完成的表体附加到表中 PublishTable在加载时运行,当用户单击“go”按钮时运行。因此,我希望加载和重建时的性能类似 当第一次加载“真实”页面时,Firefox[根据performance.now()]大约需要300毫秒来构造表。当宣布此结果的警报()关闭时,我可以立即上下滚动页面 但如果我点击“go”按钮重建表格,Firefox会在我关闭alert()对话框后旋转数十秒(或更长时间)。一个“stop script?”对话框可能会出现多次。简单版本的行为类似 所以:使用javascript构建表,javascript,html,firefox,html-table,appendchild,Javascript,Html,Firefox,Html Table,Appendchild,我试图理解为什么在Firefox43.0.2上使用javascript重建一个表需要这么长时间 下面是我的代码的简化版本。“真实”代码和简单版本都使用“publishTable()向表中添加行。publishTable删除一个表体元素(如果存在),创建一个新的表体元素,向其添加约9000行,并将完成的表体附加到表中 PublishTable在加载时运行,当用户单击“go”按钮时运行。因此,我希望加载和重建时的性能类似 当第一次加载“真实”页面时,Firefox[根据performance.now
为什么初始构建和重新构建的性能有如此大的差异?显然可以在300ms内构建表!我能做些什么吗 进一步观察:
IE的性能在初始加载时差得多,在重建时也差得多。Chrome的性能相当不错:构建或重建需要2秒。
如果我使用innerHTML,而不是insertRow、appendChild等,结果是相似的 如果我拆下将表体固定到工作台的管路,则不会出现车轮打滑症状 在“瀑布”图中(在Firefox性能工具中),“DOM事件”比“事件处理程序”(我认为它涵盖了代码的运行时)占用的时间要多得多,我不知道这意味着什么。在js停止运行和DOM事件结束之间发生了什么,这不属于其他瀑布类别吗 DOM事件之后是重新计算样式的短暂时间、绘制的时间,然后是一系列的“循环收集”周期,然后是“增量gc”、“cc图形缩减”、“循环收集”、“图形缩减”等,持续数十秒。在一种情况下,性能调用树为“Gecko”分配了49秒(这似乎是空闲时间)和另外25秒的“图形”(在这段时间内,publishTable()只分配了1秒)。这里有什么我可以采取行动的吗 对于进一步的分析,或者如何修改js,我没有合理的想法。我对性能信息的理解不够,无法对其采取行动。(现在,在与IE和Chrome进行计时后,我甚至不确定该向谁提出这个问题。) 代码中是否存在根本性错误?更好的表构造策略?使用性能工具来理解问题的方法?Firefox中的一个bug?(现在我将在服务器端做这件事。但我仍然好奇到底发生了什么。)
去
?
你好
(功能(){
变量mmm=['1'、'2'、'3'、'4'、'5'、'6'、'7'];
函数publishTable(){
//用户可能会多次运行,每次都会更改一些参数。
var tStart=performance.now();
var table=document.getElementById('tideTable');
//var tableBody=table.getElementsByTagName('tbody')[0];
var tableBody=table.tBodies[0];
if(表体){
tableBody.parentNode.removeChild(tableBody);
}
showHeight();
tableBody=document.createElement('tbody');
对于(变量i=0;i<8500;i++){
appendTableRow(表体,毫米);
}
table.appendChild(表体);
document.getElementById(“btnGo”).disabled=false;
警报(“时间:”+(performance.now()-tStart)+“毫秒”);
showHeight();
}
函数appendTableRow(表体、列){
var细胞;
var-textNode;
var row=tableBody.insertRow(-1);
对于(var i=0;i
我想,这可能是因为在插入新项目之前删除了现有项目。您可以尝试以下操作:
我建议您考虑使用angurjs,如果您打算使表动态
您的JS被缩小,在云前CDN。 异步的 推迟 结果 同样的时间Firefox加载时为142ms 每次点击事件的平均值为230ms 铬负载846ms 每次点击事件的平均值为930ms 将您的
标签放在结束
标签之前
(函数(){
变量mmm=['1'、'2'、'3'、'4'、'5'、'6'、'7'];
函数publishTable(){
//用户可能会多次运行,每次都会更改一些参数。
var tStart=performance.now();
var table=document.getElementById('tideTable');
var tableBody=table.getElementsByTagName('tbody')[0];
if(表体){
tableBody.parentNode.removeChild(tableBody);
}
tableBody=document.createElement('tbody');
for(var i=
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<div id='a'>
<button type="button" disabled id="btnGo">Go</button><br />
<button type="button" id="btnQ">?</button><br />
<table id="tideTable" style="Width:40%;margin-left:auto;margin-right:auto;">
</table>
</div>
<div id="b">
hello
</div>
<script>
(function() {
var mmm = ['one', 'two', 'three', "four", "five", "six", "seven"];
function publishTable() {
// The user may run this several times, varying some parameters each time.
var tStart = performance.now();
var table = document.getElementById('tideTable');
// var tableBody = table.getElementsByTagName('tbody')[0];
var tableBody = table.tBodies[0];
if (tableBody) {
tableBody.parentNode.removeChild(tableBody);
}
showHeight();
tableBody = document.createElement('tbody');
for (var i=0; i < 8500; i++) {
appendTableRow(tableBody, mmm);
}
table.appendChild(tableBody);
document.getElementById("btnGo").disabled = false;
alert("Time: " + (performance.now() - tStart) + "ms");
showHeight();
}
function appendTableRow(tableBody, columns) {
var cell;
var textNode;
var row = tableBody.insertRow(-1);
for (var i = 0; i < columns.length; i++) {
cell = row.insertCell(i);
textNode = document.createTextNode(columns[i]);
cell.appendChild(textNode);
}
}
function showHeight(){
var el = document.getElementById('b');
var topPos = el.offsetTop;
alert("position: " + topPos);
}
document.getElementById("btnGo").addEventListener("click", publishTable);
document.getElementById("btnQ").addEventListener("click", showHeight);
publishTable();
})();
</script>
</body>
</html>
var tableBody = table.getElementsByTagName('tbody')[0];
var tableBody = table.tBodies[0];