【发布时间】:2023-03-24 04:45:02
【问题描述】:
根据 stackoverflow 的精神(感谢@Bill the Lizard 澄清这一点),我想介绍一下所有前端 Web 开发人员都知道的小问题。
如何在编写 DHTML、使用 innerHTML 或 DOM 操作时获得更好的 jscript 性能?
为了测试,我创建了带有“开始测试”按钮的单个 HTML 页面,该按钮运行 5000 次功能对,该功能是使用 innerHTML 思想或由 DOM 编写的。 (可上:http://codepad.org/HyiKRsNk)
- 为了避免比较 CPU 结果以百分比显示,一个函数如何比另一个更快。因此,如果您看到 (17%),则意味着 DOM 更快 innerHTML,如果(可能是后者)您看到 (-5%),则意味着 innerHTML 比 DOM 更快。
- 为避免内存爆炸的影响,每次调用都会在测试后立即创建和删除新的“测试区域”(没有遇到创建/删除时间)。
- 测试在 display:none div 下进行以避免翻转和滚动时性能下降
我准备了3个测试(@tomdemuyt提出的最后一个)
为其创建新的 DIV 和子文本
删除部分DIV(为避免创建差异的影响,两个测试使用相同的方式创建测试div,但删除不同)
添加 onclick 事件处理程序
- 深度测试树的创建,测试创建
<table><tbody><tr><td><span>text构造。 DOM 测试使用对 createElement/appendChild 的顺序调用 -
与 (4) 类似,但创建了 2 行
<tr>。 DOM 使用特殊的辅助函数来简化:treeHelper("table", treeHelper("tbody", treeHelper("tr",
不同浏览器的测试结果如下。
所以亲爱的同事请提供:当 innerHTML 更快时显示一些测试,在尚未列出的浏览器上开始我的测试。
【问题讨论】:
-
有很多变化会影响性能。 1.)哪个浏览器,2.)您要插入哪些元素,3.)要插入的元素/DOMString 的数量等。特别是旧版本的 IE 存在主要的字符串连接性能问题,因此即使 .innerHTML 插入可能更快与构建 DOM 相比,由于字符串 concat 问题,IE 会更慢。
-
@scunliffe - 根本没有连接!仅附有完整的字符串,请在下面查看我的答案,以下是 4 个浏览器的列表。如果您能提供更多 - 那就太好了!
-
true 在这个测试中它可能只是一个简单的字符串,但实际上你将构建各种元素集合(例如,整个表格,包装在一个表单中,在一个 div 中放入页面的某个地方)。您还需要注意,您无法在 IE 中设置某些 .innerHTML 值,反之亦然,在 IE 中的标准 DOM 操作中您无法执行许多操作。像 jQuery 这样的 JS 库在这里真的很有帮助,因为它们可以将你从这些浏览器的差异中分离出来。
-
@scunliffe 抱歉,例如,无法理解,“...实际上您将构建各种元素集合...”这如何影响基准测试什么是更快的 DOM 或 innerHTML?您能否提供描述您想法的测试用例或场景,我会将其放入所有测试集合中。
标签: performance dom javascript innerhtml