DHTML性能提高的其他技巧
Truly 译
More Performance Tips(英文)
[url]http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dndude/html/dude100499.asp [/url]
在微软开发过程的最重要的事情之一就是为产品进行调优。
多数开发人员把性能调优看作是某个功能的审查部分之一。如何为Win32程序调优进行了很多年,有大量的文献可以参考。
令许多DHTML和HTML开发者们的头痛的就是没有足够多的技术文献来了解使页面更快方法和造成了页面缓慢的原因。当然,也有一些简单的事情,比如页面上不使用2MB的图片。不过,在对DHTML页面提速的工作中,我们发现了一些有趣的技巧和窍门,可以用来提高你自己页面的性能。
这次我要调整的代码示例是一个table构建程序。它要构建一个1000多行表格,通过使用document.createElement()和element.insertBefore()方法。每行包含一个单元格cell。每个单元格内容为"Text"。实现这一代码的最差劲的代码是什么样子的?这一小段优化代码可以改善多少?非常多!
我起初写了一段自以为很快的代码,我努力避免了一些非常低级的错误,比如不进行变量声明,或者在同一个页面同时使用VBScript和JScript。代码如下:
<html>
<body>
<script>
var tbl, tbody, tr, td, text, i, max;
max = 1000;
tbl = document.createElement("TABLE");
tbl.border = "1";
tbody = document.createElement("TBODY");
tbl.insertBefore(tbody, null);
document.body.insertBefore(tbl, null);
for (i=0; i<max; i++) {
tr = document.createElement("TR");
td = document.createElement("TD");
text = document.createTextNode("Text");
td.insertBefore(text, null);
tr.insertBefore(td, null);
tbody.insertBefore(tr, null);
}
</script>
</body>
</html>
查看示例1
所有的测试都运行在Intel Pentium II 233 ,64MB内存, Windows NT® 4.0和Internet Explorer 5,每个页面都从本地磁盘加载。所有的事件计时都是从页面的初始加载到页面“静止”(所有的队列事件都已执行,屏幕重绘完成)。基线页面(我称作‘Test1’)花费了2328毫秒。
在DHTML页面中经常用到,并且相当耗时的操作是全局对象引用。像“document”, “body”,“window”等,这些变量引用的代价比简单通过一个局部变量引用要昂贵的多。
我决定首先要改动的就是将“document.body”的引用“缓存”到一个变量“theBody”。只是给body属性加了另一个引用,因此这个改动相对小。
代码中增加了该行:
var theBody = document.body;
并且将行:
document.body.insertBefore(tbl, null);
调整为:
theBody.insertBefore(tbl, null);
查看示例2
上面的调整并没有影响到整个的时间,仅仅节省了3ms加载时间。然而,如果我们把这段代码引入到主循环中,结果将会变得极具意义。
接下来我打算做的是把document对象本身也缓存起来。由于document对象被引用了3002次在这个示例中。
下面是将document缓存到局部变量后的版本,所有其它的引用也指向了局部变量:
<html>
<body>
<script>
var tbl, tbody, tr, td, text, i, max;
max = 1000;
var theDoc = document;
var theBody = theDoc.body;
tbl = theDoc.createElement("TABLE");
tbl.border = "1";
tbody = theDoc.createElement("TBODY");
tbl.insertBefore(tbody, null);
theBody.insertBefore(tbl, null);
for (i=0; i<max; i++) {
tr = theDoc.createElement("TR");
td = theDoc.createElement("TD");
text = theDoc.createTextNode("Text");
td.insertBefore(text, null);
tr.insertBefore(td, null);
tbody.insertBefore(tr, null);
}
</script>
</body>
</html>
查看示例3
这个版本的页面加载只需要2100ms。这样以来,我们将应用程序的整个运行时间减少了10%,并且很有实际意义。获取一个document变量比局部变量大约多花费4ms时间。
一个是否常用的document加载速度的优化是为<script>标签指定defer属性。设置这个属性仅适合不需要立即运行<SCRIPT>中代码的情况。(立即运行的代码指不在函数体内的--这些代码将会在脚本块加载后立即执行)当defer属性设置后,IE不会等待加载和转换这段脚本。这就也为着页面加载会快很多。通常这意味着立即运行的脚本应该封装放在一个函数内,并通过document或者body的onload的事件处理。如果你的脚本是依赖于页面加载后的用户动作--如点击按钮,或者移动鼠标到某个区域,会更加有用!不过,如果你的代码希望立即执行,或者在page加载后立即马上执行,就无法利用这个特性了。
下面是增加了defer属性后新的版本
<html>
<body onload="init()">
<script defer>
function init() {
var tbl, tbody, tr, td, text, i, max;
max = 1000;
var theDoc = document;
var theBody = theDoc.body;
tbl = theDoc.createElement("TABLE");
tbl.border = "1";
tbody = theDoc.createElement("TBODY");
tbl.insertBefore(tbody, null);
theBody.insertBefore(tbl, null);
for (i=0; i<max; i++) {
tr = theDoc.createElement("TR");
td = theDoc.createElement("TD");
text = theDoc.createTextNode("Text");
td.insertBefore(text, null);
tr.insertBefore(td, null);
tbody.insertBefore(tr, null);
}
}
</script>
</body>
</html>
查看示例4
页面加载时间降为2043ms了。相对基线页有12%的提升,相对前一版本有2.5%的提升。
接下来要改进的更有意义,但是有一点棘手。当创建element并添加到节点树,并将它们添加到主document上更有效率--不是把它们添加给一个大的子树,然后将这个子树添加到document上。例如,如果我们打算创建一个新的表格行row,并带有一个含有文本的单元格cell,我将这么做:
create <TR>
create <TD>
create TextNode
insert TextNode into <TD>
insert <TD> into <TR>
insert <TR> into TBODY
但是上面的方法会比下面的慢:
create <TR>
create <TD>
create TextNode
insert <TR> into TBODY
insert <TD> into <TR>
insert TextNode into <TD>
前面的示例都使用了第一个方法,示例5将会使用上面第二个方法,完整代码如下:
<html>
<body onload="init()">
<script defer>
function init() {
var tbl, tbody, tr, td, text, i, max;
max = 1000;
var theDoc = document;
var theBody = theDoc.body;
tbl = theDoc.createElement("TABLE");
tbl.border = "1";
tbody = theDoc.createElement("TBODY");
tbl.insertBefore(tbody, null);
theBody.insertBefore(tbl, null);
for (i=0; i<max; i++) {
tr = theDoc.createElement("TR");
td = theDoc.createElement("TD");
text = theDoc.createTextNode("Text");
tbody.insertBefore(tr, null);
tr.insertBefore(td, null);
td.insertBefore(text, null);
}
}
</script>
</body>
</html>
查看示例5
示例5仅需1649ms。比上个版本要快25%,并且比基线页快了几乎30%。
下一步要调整的是修改table使用fixed-table布局(layout)。指定了fixed-table布局后的表格的列宽使用<COL>标签设置,或者,如果没有<COL>标签,每个单元格的空间从行平分。fixed-table布局样式将改善table的性能,因为每个单元格的内容的尺寸不需要进行计算了。这是一个非常实用的性能改善方法,特别是那些有很多列的大型表格。
这个操作也可以通过简单增加css样式实现:
tbl.style.tableLayout = "fixed";
查看示例6
然而,由于本示例只有一个单元格,所以这个改动只带来1.6%的性能提升。这个提示会随着table的单元格数量增加而增加。
最后的2个示例包括调整给单元格赋值的方式。在所有的示例中,创建了一个TextNode,并添加给TD。而示例7,将使用inerText代替插入一个text节点,代码调整为:
td.innerText = "Text";
(译者:innerText只在IE中受支持,属于IE扩展,兼容FireFox可使用innerHTML)
查看示例7
令人惊奇的是,这个改动有显著效果--比上次快了9%,总提升36%。这样以来我们的最终测试以1473ms代替了基线页的2323ms。
目前位置,几乎所有人都知道使用element.innerHTML是很慢,很慢,很慢的。想知道有多慢,我最后放了一个使用innerHTML代替innerText来为单元格添加文本的示例。这个调整击跨了性能,总时间变成3375ms,比上个版本差了80%!。这个变化比基线页还差45%。很明显,innerHTML是相当昂贵的。
你可以查看所有的测试结果,显示了演练和平均值。
调优HTML页面跟调优Win32应用程序一样,你必须知道哪里慢下来了,而哪里比较快。希望这些技巧可以帮助你加速你的页面。
分享到:
相关推荐
摘要:本文说明了某些 DHTML 功能对性能的重大影响,并提供了一些提高 DHTML 页面性能的技巧。 目录 简介 成批处理 DHTML 更改 使用 innerText 使用 DOM 添加单个元素 扩展 SELECT 元素中的选项 用 DOM...
4. **性能优化**:对应用进行性能优化,提高用户体验。 5. **更新与维护**:定期检查应用的功能和稳定性,并及时修复发现的问题。 通过以上步骤,可以使用VB6.0中文版高效地进行DHTML应用的开发,并实现动态网页的...
10. **最佳实践**: 手册可能会提供关于性能优化、代码组织和调试技巧的最佳实践,帮助开发者更高效、更稳定地实现DHTML功能。 通过深入学习和理解这些知识点,开发者可以创建出具有丰富交互性和动态性的网页,提高...
提到的"DHTML.chm"文件很可能是一个帮助文档,包含了关于DHTML的详细信息和技术指导,可以帮助初学者快速掌握DHTML的基本概念和实践技巧。 总的来说,DHTML是构建现代网页动态效果的重要工具,通过HTML、CSS、...
DHTML手册可能包含了各种技巧,如利用CSS精灵(CSS Sprites)优化图像加载,使用事件委托提高性能,以及如何实现平滑的动画效果等。 9. **语言代码**: 语言代码通常是指HTML和JavaScript的语法,包括DOM操作、...
8. **实际应用与项目**:书中可能包含实际的网页制作项目,引导读者将所学知识应用于实际场景,提高解决实际问题的能力。 9. **调试和优化**:学习如何调试JavaScript代码和优化网页性能也是必不可少的技能。书中会...
7. **性能优化**:指导如何优化DHTML代码,提高页面加载速度和用户体验。 8. **DHTML与Ajax**:解释DHTML如何与Ajax(Asynchronous JavaScript and XML)结合,实现无刷新的数据交换。 9. **响应式设计**:讨论...
8. **最佳实践与技巧**:除了基础理论,手册还会分享一些实用技巧和最佳实践,比如如何组织代码以提高可维护性,如何调试JavaScript,以及如何利用缓存提高页面加载速度等。 9. **解压密码.txt**:这个文件很可能是...
4. **局部刷新**:仅更新页面的一部分,提高性能和用户体验。 5. **脚本交互**:通过JavaScript与服务器进行异步通信(AJAX),实现无刷新的数据交换。 综上所述,DHTML参考手册是理解并应用这些技术的宝贵资源,它...
6. **CSS调试和性能优化**:提供调试技巧和提高网页加载速度的策略。 7. **DHTML元素和属性**:列出所有DHTML元素及其属性,以及如何使用JavaScript操作这些元素。 8. **DHTML事件**:详述所有可用的事件,以及如何...
9. **学习资源**: “DHTML手册”可能包含了DHTML的语法详解、案例分析、调试技巧等内容,对于初学者来说是一份宝贵的自学资料。同时,了解和实践JavaScript框架如jQuery、Prototype等也可以加深对DHTML的理解。 10....
7. **性能优化**:指导如何编写高效的DHTML代码,减少页面加载时间和提高用户体验。 这本书对于初学者和有一定经验的开发者来说都是宝贵的资源,它可以帮助读者深入理解DHTML的工作机制,并掌握创建动态网页的技巧...
7. **AJAX应用**:DHTML也常常与AJAX(Asynchronous JavaScript and XML)技术结合,实现异步数据交换,无需刷新整个页面就能更新部分内容,提高网页性能和用户体验。 8. **现代Web开发框架**:随着Web技术的发展,...
6. **性能优化**:讨论如何优化CSS和JavaScript代码,提高页面加载速度和用户体验。 7. **浏览器兼容性**:探讨不同浏览器对CSS和DHTML的支持情况,提供跨浏览器兼容性解决方案。 总之,《CSS与DHTML精髓第2版》是...
这些实例有助于读者深入理解DHTML的工作原理,提高动手实践能力。 **浏览器兼容性问题** 虽然DHTML技术在现代浏览器中得到广泛支持,但考虑到老旧浏览器的兼容性,开发者需要熟悉如何使用JavaScript库(如jQuery)...
本指南将深入探讨这两种技术的核心概念、应用场景以及实际开发技巧。 JavaScript,全称ECMAScript,是一种轻量级的解释性编程语言,广泛应用于客户端的网页脚本。JavaScript 能够在用户的浏览器上运行,无需服务器...
这样可以减少内存占用并提高性能,尤其是当有大量动态生成的子元素时。 五、阻止默认行为与停止事件传播 - `event.preventDefault()`:阻止事件的默认行为,例如阻止链接的跳转或表单的提交。 - `event....
这三本手册对于任何希望提升Web开发技能的开发者来说都是宝贵的资源,它们涵盖了从基础概念到高级技巧的广泛内容,有助于开发者更好地理解和应用CSS、JavaScript和DHTML,构建更具吸引力和用户体验的现代网页。
8. **最佳实践**:遵循代码优化、错误处理和调试策略,提高代码质量和性能。 9. **实例解析**:书中提供的大量示例代码将帮助你快速上手并解决实际问题。 10. **实战项目**:通过实践项目,巩固所学知识,提升综合...