﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-风舞乱乱</title><link>http://www.blogjava.net/nighthun/</link><description /><language>zh-cn</language><lastBuildDate>Mon, 13 Apr 2026 09:01:25 GMT</lastBuildDate><pubDate>Mon, 13 Apr 2026 09:01:25 GMT</pubDate><ttl>60</ttl><item><title>浅谈如何提高AJAX客户端响应速度</title><link>http://www.blogjava.net/nighthun/archive/2011/05/23/350865.html</link><dc:creator>风舞乱乱</dc:creator><author>风舞乱乱</author><pubDate>Mon, 23 May 2011 10:08:00 GMT</pubDate><guid>http://www.blogjava.net/nighthun/archive/2011/05/23/350865.html</guid><description><![CDATA[<h1>浅谈如何提高AJAX客户端响应速度</h1>
<div>
<div>
<div>
<ul>
    <li><a href="http://developer.51cto.com/">http://developer.51cto.com</a>&nbsp;&nbsp;2009-06-24 15:16 &nbsp;包一磊 &nbsp;JavaEye &nbsp;<a href="http://www.51cto.com/php/feedbackt.php?id=131341">我要评论(<span id="pinglun_1">0)</a></li>
</ul>
</div>
</div>
<div></div>
<div>
<div>
<ul>AJAX 的出现极大的改变了 Web 应用客户端的操作模式，它使的用户可以在全心工作时不必频繁的忍受那令人厌恶的页面刷新。理论上 AJAX 技术在很大的程度上可以减少用户操作的等待时间，同时节约网络上的数据流量。而然，实际情况却并不总是这样。用户时常会抱怨用了 AJAX 的系统响应速度反而降低了。本文将谈谈如何提高响应速度。</ul>
    </div>
    <ul>
        <p>&nbsp;</p>
        <p>笔者从事AJAX 方面的研发多年，参与开发了目前国内较为成熟的AJAX平台 -dorado 。根据笔者的经验，导致这种结果的根本原因并不在AJAX 。很多时候系统响应速度的降低都是由不够合理的界面设计和不够高效的编程习惯造成的。下面我们就来分析几个 AJAX 开发过程中需要时刻注意的环节。</p>
        <p>&lt;!-- [if !supportLists]--&gt;n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- [endif]--&gt;合理的使用AJAX客户端编程和远程过程调用。</p>
        <p>AJAX客户端的编程主要都是基于 JavaScript 的。而 JavaScript 是一种解释型的编程语言，它的运行效率相对于 Java 等都要稍逊一筹。同时 JavaScript 又是运行在浏览器这样一个严格受限的环境当中。因此开发人员对于哪些逻辑可以在客户端执行应该有一个清醒的认识。</p>
        <p>在实际的应用中究竟应该怎样使用 客户端编程，这依赖于开发人员的经验判断。这里很多问题是只可意会的。由于篇幅有限，在这里我们大致归纳出下面这几个注意事项：</p>
        <p>&lt;!-- [if !supportLists]--&gt;u&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- [endif]--&gt;尽可能避免频繁的使用远程过程调用，例如避免在循环体中使用远程过程调用。</p>
        <p>&lt;!-- [if !supportLists]--&gt;u&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- [endif]--&gt;如果可能的话尽可能使用 AJAX 方式的远程过程调用（异步方式的远程过程调用）。</p>
        <p>&lt;!-- [if !supportLists]--&gt;u&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- [endif]--&gt;避免将重量级的数据操作放置在 客户端。例如：大批量的数据复制操作、需要通过大量的数据遍历完成的计算等。</p>
        <p>&lt;!-- [if !supportLists]--&gt;n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- [endif]--&gt;改进对 DOM 对象的操作方式。</p>
        <p>客户端的编程中，对 DOM 对象的操作往往是最容易占用 CPU 时间的。而对于 DOM 对象的操作，不同的编程方法之间的性能差异又往往是非常大的。</p>
        <p>以下是三段运行结果完全相同的代码，它们的作用是在网页中创建一个 10x1000 的表格。然而它们的运行速度却有着天壤之别。</p>
        <pre>
        <ol>
            <li>/*&nbsp;测试代码&nbsp;1&nbsp;-&nbsp;耗时&nbsp;:&nbsp;41&nbsp;秒&nbsp;*/&nbsp; &nbsp;</li>
            <li>var&nbsp;<font color="#ff0000">table</font>&nbsp;=&nbsp;<font color="#0000ff">document</font>.createElement("TABLE");&nbsp; &nbsp;</li>
            <li>document.body.appendChild(table);&nbsp; &nbsp;</li>
            <li>for(var&nbsp;<font color="#ff0000">i</font>&nbsp;=&nbsp;<font color="#0000ff">0</font>;&nbsp;i&nbsp;<strong><font color="#006699">&lt;</font></strong>&nbsp;<strong><font color="#006699">1000</font></strong>;&nbsp;i++){&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;var&nbsp;<font color="#ff0000">row</font>&nbsp;=&nbsp;<font color="#0000ff">table</font>.insertRow(-1);&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;for(var&nbsp;<font color="#ff0000">j</font>&nbsp;=&nbsp;<font color="#0000ff">0</font>;&nbsp;j&nbsp;<strong><font color="#006699">&lt;</font></strong>&nbsp;<strong><font color="#006699">10</font></strong>;&nbsp;j++){&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;<font color="#ff0000">cell</font>&nbsp;=&nbsp;<font color="#0000ff">objRow</font>.insertCell(-1);&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff0000">cell.innerText</font>&nbsp;=&nbsp;<font color="#0000ff">"(&nbsp;"</font>&nbsp;+&nbsp;i&nbsp;+&nbsp;"&nbsp;,&nbsp;"&nbsp;+&nbsp;j&nbsp;+&nbsp;"&nbsp;)";&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;}&nbsp; &nbsp;</li>
            <li>}&nbsp; &nbsp;</li>
            <li>/*&nbsp;测试代码&nbsp;2&nbsp;-&nbsp;耗时&nbsp;:&nbsp;7.6&nbsp;秒&nbsp;*/&nbsp; &nbsp;</li>
            <li>var&nbsp;<font color="#ff0000">table</font>&nbsp;=&nbsp;<font color="#0000ff">document</font>.getElementById("TABLE");&nbsp; &nbsp;</li>
            <li>document.body.appendChild(table);&nbsp; &nbsp;</li>
            <li>var&nbsp;<font color="#ff0000">tbody</font>&nbsp;=&nbsp;<font color="#0000ff">document</font>.createElement("TBODY");&nbsp; &nbsp;</li>
            <li>table.appendChild(tbody);&nbsp; &nbsp;</li>
            <li>for(var&nbsp;<font color="#ff0000">i</font>&nbsp;=&nbsp;<font color="#0000ff">0</font>;&nbsp;i&nbsp;<strong><font color="#006699">&lt;</font></strong>&nbsp;<strong><font color="#006699">1000</font></strong>;&nbsp;i++){&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;var&nbsp;<font color="#ff0000">row</font>&nbsp;=&nbsp;<font color="#0000ff">document</font>.createElement("TR");&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;tbody.appendChild(row);&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;for(var&nbsp;<font color="#ff0000">j</font>&nbsp;=&nbsp;<font color="#0000ff">0</font>;&nbsp;j&nbsp;<strong><font color="#006699">&lt;</font></strong>&nbsp;<strong><font color="#006699">10</font></strong>;&nbsp;j++){&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;<font color="#ff0000">cell</font>&nbsp;=&nbsp;<font color="#0000ff">document</font>.createElement("TD");&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;row.appendChild(cell);&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff0000">cell.innerText</font>&nbsp;=&nbsp;<font color="#0000ff">"(&nbsp;"</font>&nbsp;+&nbsp;i&nbsp;+&nbsp;"&nbsp;,&nbsp;"&nbsp;+&nbsp;j&nbsp;+&nbsp;"&nbsp;)";&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;}&nbsp; &nbsp;</li>
            <li>}&nbsp; &nbsp;</li>
            <li>/*&nbsp;测试代码&nbsp;3&nbsp;-&nbsp;耗时&nbsp;:&nbsp;1.26&nbsp;秒&nbsp;*/&nbsp; &nbsp;</li>
            <li>var&nbsp;<font color="#ff0000">tbody</font>&nbsp;=&nbsp;<font color="#0000ff">document</font>.createElement("TBODY");&nbsp; &nbsp;</li>
            <li>for(var&nbsp;<font color="#ff0000">i</font>&nbsp;=&nbsp;<font color="#0000ff">0</font>;&nbsp;i&nbsp;<strong><font color="#006699">&lt;</font></strong>&nbsp;<strong><font color="#006699">1000</font></strong>;&nbsp;i++){&nbsp;&nbsp;&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;var&nbsp;<font color="#ff0000">row</font>&nbsp;=&nbsp;<font color="#0000ff">document</font>.createElement("TR");&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(var&nbsp;<font color="#ff0000">j</font>&nbsp;=&nbsp;<font color="#0000ff">0</font>;&nbsp;j&nbsp;<strong><font color="#006699">&lt;</font></strong>&nbsp;<strong><font color="#006699">10</font></strong>;&nbsp;j++){&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;<font color="#ff0000">cell</font>&nbsp;=&nbsp;<font color="#0000ff">document</font>.createElement("TD");&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff0000">cell.innerText</font>&nbsp;=&nbsp;<font color="#0000ff">"(&nbsp;"</font>&nbsp;+&nbsp;i&nbsp;+&nbsp;"&nbsp;,&nbsp;"&nbsp;+&nbsp;j&nbsp;+&nbsp;"&nbsp;)";&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;row.appendChild(cell);&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;}&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;tbody.appendChild(row);&nbsp; &nbsp;</li>
            <li>}&nbsp; &nbsp;</li>
            <li>var&nbsp;<font color="#ff0000">table</font>&nbsp;=&nbsp;<font color="#0000ff">document</font>.getElementById("TABLE");&nbsp; &nbsp;</li>
            <li>table.appendChild(tbody);&nbsp; &nbsp;</li>
            <li>document.body.appendChild(table);&nbsp;&nbsp;</li>
        </ol>
        </pre>
        <p>这里的&#8220;测试代码 1 &#8221;和&#8220;测试代码 2 &#8221;之间的差别在于在创建表格单元时使用了不同的 API 方法。而&#8220;测试代码 2 &#8221;和&#8220;测试代码 3 &#8221; 之间的差别在于处理顺序的略微不同。</p>
        <p>&#8220;测试代码 1 &#8221;和&#8220;测试代码 2 &#8221;之间如此大的性能差别我们无从分析，目前所知的是 insertRow 和 insertCell 是 DHTML 中表格特有的 API ， createElement 和 appendChild 是 W3C DOM 的原生 API 。而前者应该是对后者的封装。不过，我们并不能因此而得出结论认为 DOM 的原生 API 总是优于对象特有的 API 。建议大家在需要频繁调用某一 API 时，对其性能表现做一些基本的测试。</p>
        <p>&#8220;测试代码 2 &#8221;和&#8220;测试代码 3 &#8221;之间的性能差异主要来自于他们的构建顺序不同。&#8220;测试代码 2 &#8221;的做法是首先创建最外层的 &lt;TABLE&gt; 对象，然后再在循环中依次创建 &lt;TR&gt; 和 &lt;TD&gt; 。而&#8220;测试代码 3 &#8221;的做法是首先在内存中由内到外的构建好整个表格，最后再将它添加到网页中。这样做的目的是尽可能的减少浏览器重新计算页面布局的次数。每当我们将一个对象添加到网页中时，浏览器都会尝试对页面中的控件的布局进行重新计算。所以，如果我们能够首先在内存中将整个要构造的对象全部创建好，然后再一次性的添加到网页中。那么，浏览器将只会做一次布局的重计算 。总结为一句话那就是越晚执行 appendChild 越好。有时为了提高运行效率，我们甚至可以考虑先使用 removeChild 将已存在的控件从页面中移除，然后构造完成后再重新将其放置回页面当中。</p>
        <p>&lt;!-- [if !supportLists]--&gt;n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- [endif]--&gt;提高字符串累加的速度</p>
        <p>在使用 AJAX 提交信息时，我可能常常需要拼装一些比较大的字符串通过 XmlHttp 来完成 POST 提交。尽管提交这样大的信息的做法看起来并不优雅，但有时我们可能不得不面对这样的需求。那么 JavaScript 中对字符串的累加速度如何呢？我们先来做下面的这个实验。累加一个长度为 30000 的字符串。</p>
        <pre>
        <ol>
            <li>/*&nbsp;测试代码&nbsp;1&nbsp;-&nbsp;耗时&nbsp;:&nbsp;14.325&nbsp;秒&nbsp;*/&nbsp;&nbsp; &nbsp;</li>
            <li>var&nbsp;<font color="#ff0000">str</font>&nbsp;=&nbsp;<font color="#0000ff">""</font>;&nbsp; &nbsp;</li>
            <li>for&nbsp;(var&nbsp;<font color="#ff0000">i</font>&nbsp;=&nbsp;<font color="#0000ff">0</font>;&nbsp;i&nbsp;<strong><font color="#006699">&lt;</font></strong>&nbsp;<strong><font color="#006699">50000</font></strong>;&nbsp;i++)&nbsp;{&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;+=&nbsp;"xxxxxx";&nbsp; &nbsp;</li>
            <li>}&nbsp;&nbsp;</li>
        </ol>
        </pre>
        <p>这段代码耗时 14.325 秒，结果并不理想。现在我们将代码改为如下的形式：</p>
        <pre>
        <ol>
            <li>/*&nbsp;测试代码&nbsp;2&nbsp;-&nbsp;耗时&nbsp;:&nbsp;0.359&nbsp;秒&nbsp;*/&nbsp;&nbsp; &nbsp;</li>
            <li>var&nbsp;<font color="#ff0000">str</font>&nbsp;=&nbsp;<font color="#0000ff">""</font>;&nbsp; &nbsp;</li>
            <li>for&nbsp;(var&nbsp;<font color="#ff0000">i</font>&nbsp;=&nbsp;<font color="#0000ff">0</font>;&nbsp;i&nbsp;<strong><font color="#006699">&lt;</font></strong>&nbsp;<strong><font color="#006699">100</font></strong>;&nbsp;i++)&nbsp;{&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;<font color="#ff0000">sub</font>&nbsp;=&nbsp;<font color="#0000ff">""</font>;&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(var&nbsp;<font color="#ff0000">j</font>&nbsp;=&nbsp;<font color="#0000ff">0</font>;&nbsp;j&nbsp;<strong><font color="#006699">&lt;</font></strong>&nbsp;<strong><font color="#006699">500</font></strong>;&nbsp;j++)&nbsp;{&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sub&nbsp;+=&nbsp;"xxxxxx";&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;+=&nbsp;sub;&nbsp; &nbsp;</li>
            <li>}&nbsp;&nbsp;</li>
        </ol>
        </pre>
        <p>这段代码耗时 0.359 秒！同样的结果，我们做的只是首先拼装一些较小的字符串然后再组装成更大的字符串。这种做法可以有效的在字符串拼装的后期减小内存复制的数据量。知道了这一原理之后我们还可以把上面的代码进一步拆散以后进行测试。下面的代码仅耗时 0.140 秒。</p>
        <pre>
        <ol>
            <li>/*&nbsp;测试代码&nbsp;3&nbsp;-&nbsp;耗时&nbsp;:&nbsp;0.140&nbsp;秒&nbsp;*/&nbsp; &nbsp;</li>
            <li>var&nbsp;<font color="#ff0000">str</font>&nbsp;=&nbsp;<font color="#0000ff">""</font>;&nbsp;&nbsp; &nbsp;</li>
            <li>for&nbsp;(var&nbsp;<font color="#ff0000">i1</font>&nbsp;=&nbsp;<font color="#0000ff">0</font>;&nbsp;i1&nbsp;<strong><font color="#006699">&lt;</font></strong>&nbsp;<strong><font color="#006699">5</font></strong>;&nbsp;i1++)&nbsp;{&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;<font color="#ff0000">str1</font>&nbsp;=&nbsp;<font color="#0000ff">""</font>;&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(var&nbsp;<font color="#ff0000">i2</font>&nbsp;=&nbsp;<font color="#0000ff">0</font>;&nbsp;i2&nbsp;<strong><font color="#006699">&lt;</font></strong>&nbsp;<strong><font color="#006699">10</font></strong>;&nbsp;i2++)&nbsp;{&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;<font color="#ff0000">str2</font>&nbsp;=&nbsp;<font color="#0000ff">""</font>;&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(var&nbsp;<font color="#ff0000">i3</font>&nbsp;=&nbsp;<font color="#0000ff">0</font>;&nbsp;i3&nbsp;<strong><font color="#006699">&lt;</font></strong>&nbsp;<strong><font color="#006699">10</font></strong>;&nbsp;i3++)&nbsp;{&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;<font color="#ff0000">str3</font>&nbsp;=&nbsp;<font color="#0000ff">""</font>;&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(var&nbsp;<font color="#ff0000">i4</font>&nbsp;=&nbsp;<font color="#0000ff">0</font>;&nbsp;i4&nbsp;<strong><font color="#006699">&lt;</font></strong>&nbsp;<strong><font color="#006699">10</font></strong>;&nbsp;i4++)&nbsp;{&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;<font color="#ff0000">str4</font>&nbsp;=&nbsp;<font color="#0000ff">""</font>;&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(var&nbsp;<font color="#ff0000">i5</font>&nbsp;=&nbsp;<font color="#0000ff">0</font>;&nbsp;i5&nbsp;<strong><font color="#006699">&lt;</font></strong>&nbsp;<strong><font color="#006699">10</font></strong>;&nbsp;i5++)&nbsp;{&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str4&nbsp;+=&nbsp;"xxxxxx";&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str3&nbsp;+=&nbsp;str4;&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str2&nbsp;+=&nbsp;str3;&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str1&nbsp;+=&nbsp;str2;&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;+=&nbsp;str1;&nbsp;&nbsp;&nbsp; &nbsp;</li>
            <li>}&nbsp;&nbsp;</li>
        </ol>
        </pre>
        <p>不过，上面这种做法也许并不是最好的！如果我们需要提交的信息是 XML 格式的（其实绝大多数情况下，我们都可以设法将要提交的信息组装成 XML 格式），我们还能找到更高效更优雅的方法 &#8212; 利用 DOM 对象为我们组装字符串。下面这段代买组装一个长度为 950015 的字符串仅须耗时 0.890 秒。</p>
        <pre>
        <ol>
            <li>/*&nbsp;利用&nbsp;DOM&nbsp;对象组装信息&nbsp;-&nbsp;耗时&nbsp;:&nbsp;0.890&nbsp;秒&nbsp;*/&nbsp; &nbsp;</li>
            <li>var&nbsp;xmlDoc;&nbsp;&nbsp;&nbsp; &nbsp;</li>
            <li>if&nbsp;(<font color="#ff0000">browserType</font>&nbsp;==&nbsp;BROWSER_IE)&nbsp;{&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff0000">xmlDoc</font>&nbsp;=&nbsp;<font color="#0000ff">new</font>&nbsp;ActiveXObject("Msxml.DOMDocument");&nbsp; &nbsp;</li>
            <li>}&nbsp; &nbsp;</li>
            <li>else&nbsp;{&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff0000">xmlDoc</font>&nbsp;=&nbsp;<font color="#0000ff">document</font>.createElement("DOM");&nbsp; &nbsp;</li>
            <li>}&nbsp; &nbsp;</li>
            <li>var&nbsp;<font color="#ff0000">root</font>&nbsp;=&nbsp;<font color="#0000ff">xmlDoc</font>.createElement("root");&nbsp; &nbsp;</li>
            <li>for&nbsp;(var&nbsp;<font color="#ff0000">i</font>&nbsp;=&nbsp;<font color="#0000ff">0</font>;&nbsp;i&nbsp;<strong><font color="#006699">&lt;</font></strong>&nbsp;<strong><font color="#006699">50000</font></strong>;&nbsp;i++)&nbsp;{&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;<font color="#ff0000">node</font>&nbsp;=&nbsp;<font color="#0000ff">xmlDoc</font>.createElement("data");&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(<font color="#ff0000">browserType</font>&nbsp;==&nbsp;BROWSER_IE)&nbsp;{&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff0000">node.text</font>&nbsp;=&nbsp;<font color="#0000ff">"xxxxxx"</font>;&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;{&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff0000">node.innerText</font>&nbsp;=&nbsp;<font color="#0000ff">"xxxxxx"</font>;&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root.appendChild(node);&nbsp; &nbsp;</li>
            <li>}&nbsp; &nbsp;</li>
            <li>xmlDoc.appendChild(root);&nbsp; &nbsp;</li>
            <li>var&nbsp;str;&nbsp; &nbsp;</li>
            <li>if&nbsp;(<font color="#ff0000">browserType</font>&nbsp;==&nbsp;BROWSER_IE)&nbsp;{&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff0000">str</font>&nbsp;=&nbsp;<font color="#0000ff">xmlDoc</font>.xml;&nbsp; &nbsp;</li>
            <li>}&nbsp; &nbsp;</li>
            <li>else&nbsp;{&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff0000">str</font>&nbsp;=&nbsp;<font color="#0000ff">xmlDoc</font>.innerHTML;&nbsp; &nbsp;</li>
            <li>}&nbsp; &nbsp;</li>
            <li><font color="#008200">&lt;!--&nbsp;[if&nbsp;!supportLists]--&gt;</font>n&nbsp;&nbsp;&nbsp;</li>
        </ol>
        </pre>
        <p>&lt;!-- [endif]--&gt;避免 DOM 对象的内存泄漏。</p>
        <p>关于 IE 中 DOM 对象的内存泄露是一个常常被开发人员忽略的问题。然而它带来的后果却是非常严重的！它会导致 IE 的内存占用量持续上升，并且浏览器的整体运行速度明显下降。对于一些泄露比较严重的网页，甚至只要刷新几次，运行速度就会降低一倍。</p>
        <p>比较常见的内存泄漏的模型有&#8220; 循环引用 模型&#8221;、&#8220; 闭包函数 模型&#8221;和&#8220; DOM 插入顺序模型&#8221; , 对于前两种泄漏模型，我们都可以通过在网页析构时解除引用的方式来避免。而对于&#8220; DOM 插入顺序模型&#8221;则需要通过改变一些惯有的编程习惯的方式来避免。</p>
        <p>有关内存泄漏的模型的更多介绍可以通过 Google 很快的查到，本文不做过多的阐述。不过，这里我向您推荐一个可用于查找和分析网页内存泄露的小工具 &#8212; Drip ，目前的较新版本是 0.5 ，下载地址是 http://outofhanwell.com/ieleak/index.php</p>
        <p>&lt;!-- [if !supportLists]--&gt;n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- [endif]--&gt;复杂页面的分段装载和初始化</p>
        <p>对系统当中某些确实比较复杂而又不便使用 IFrame 的界面，我们可以对其实施分段装载。例如对于多页标签的界面，我们可以首先下载和初始化多页标签的默认页，然后利用 AJAH （ asynchronous JavaScript and HTML ）技术来异步的装载其他标签页中的内容。这样就能保证界面可以在第一时间首先展现给用户。把整个复杂界面的装载过程分散到用户的操作过程当中。</p>
        <p>&lt;!-- [if !supportLists]--&gt;n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- [endif]--&gt;利用 GZIP 压缩网络流量。</p>
        <p>除了上面提到的这些代码级的改良之外，我们还可以利用 GZIP 来有效的降低网络流量。目前常见的主流浏览器已经全部支持 GZIP 算法，我们往往只需要编写少量的代码就可以支持 GZIP 了。例如在 J2EE 中我们可以在 Filter 中通过下面的代码来判断客户端浏览器是否支持 GZIP 算法，然后根据需要利用 java.util.zip.GZIPOutputStream 来实现 GZIP 的输出。</p>
        <pre>
        <ol>
            <li>/*&nbsp;判断浏览器对&nbsp;GZIP&nbsp;支持方式的代码&nbsp;*/&nbsp; &nbsp;</li>
            <li>private&nbsp;static&nbsp;String&nbsp;getGZIPEncoding(HttpServletRequest&nbsp;request)&nbsp;{&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;String&nbsp;<font color="#ff0000">acceptEncoding</font>&nbsp;=&nbsp;<font color="#0000ff">request</font>.getHeader("Accept-Encoding");&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;if&nbsp;(<font color="#ff0000">acceptEncoding</font>&nbsp;==&nbsp;null)&nbsp;return&nbsp;null;&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;<font color="#ff0000">acceptEncoding</font><font color="#0000ff">acceptEncoding</font>&nbsp;=&nbsp;acceptEncoding.toLowerCase();&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;if&nbsp;(acceptEncoding.indexOf("x-gzip")&nbsp;<strong><font color="#006699">&gt;</font></strong>=&nbsp;0)&nbsp;return&nbsp;"x-gzip";&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;if&nbsp;(acceptEncoding.indexOf("gzip")&nbsp;<strong><font color="#006699">&gt;</font></strong>=&nbsp;0)&nbsp;return&nbsp;"gzip";&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;return&nbsp;null;&nbsp; &nbsp;</li>
            <li>}&nbsp;</li>
        </ol>
        </pre>
        <p>一般而言， GZIP 对于 HTML 、 JSP 的压缩比可以达到 80% 左右，而它造成的服务端和客户端的性能损耗几乎是可以忽略的。结合其他因素，支持 GZIP 的网站有可能为我们节约 50% 的网络流量。因此 GZIP 的使用可以为那些网络环境不是特别好的应用带来显著的性能提升。使用 Http 的监视工具 Fiddler 可以方便的检测出网页在使用 GZIP 前后的通讯数据量。 Fiddler 的下载地址是 http://www.fiddlertool.com/fiddler/</p>
        <p>关于 Web 应用的性能优化其实是一个非常大的话题。本文由于篇幅有限，只能涉及其中的几个细节，并且也无法将这些细节的优化方式全面的展现给大家。期望本文能够引起大家对 Web 应用尤其是客户端性能优化的充分重视。毕竟服务端编程技巧已为大家熟知多年，在服务端挖掘性能的潜力已经不大了。而在客户端的方法改进往往能够得到令人惊奇的性能提升。</p>
        <p>【编辑推荐】</p>
        <ol>
            <li><a href="http://developer.51cto.com/art/200906/131033.htm" target="_blank"><font color="#0000ff">JSF和Spring的集成</font></a></li>
            <li><a href="http://developer.51cto.com/art/200906/131009.htm" target="_blank"><font color="#0000ff">JSF中使用自定义Navigation</font></a></li>
            <li><a href="http://developer.51cto.com/art/200906/131028.htm" target="_blank"><font color="#0000ff">简单介绍JSF应用</font></a></li>
            <li><a href="http://developer.51cto.com/art/200906/130997.htm" target="_blank"><font color="#0000ff">JSF动态生成固定表头和行标的DataTable</font></a></li>
            <li><a href="http://developer.51cto.com/art/200906/130990.htm" target="_blank"><font color="#0000ff">JSF和JSP是一对新的搭档</font></a></li>
        </ol>
    </ul>
    </div>
    </div>
    </span><img src ="http://www.blogjava.net/nighthun/aggbug/350865.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nighthun/" target="_blank">风舞乱乱</a> 2011-05-23 18:08 <a href="http://www.blogjava.net/nighthun/archive/2011/05/23/350865.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>浅谈如何提高AJAX客户端响应速度【转】</title><link>http://www.blogjava.net/nighthun/articles/350864.html</link><dc:creator>风舞乱乱</dc:creator><author>风舞乱乱</author><pubDate>Mon, 23 May 2011 10:07:00 GMT</pubDate><guid>http://www.blogjava.net/nighthun/articles/350864.html</guid><description><![CDATA[<div>
<ul>AJAX 的出现极大的改变了 Web 应用客户端的操作模式，它使的用户可以在全心工作时不必频繁的忍受那令人厌恶的页面刷新。理论上 AJAX 技术在很大的程度上可以减少用户操作的等待时间，同时节约网络上的数据流量。而然，实际情况却并不总是这样。用户时常会抱怨用了 AJAX 的系统响应速度反而降低了。本文将谈谈如何提高响应速度。</ul>
    </div>
    <ul>
        <p>&nbsp;</p>
        <p>笔者从事AJAX 方面的研发多年，参与开发了目前国内较为成熟的AJAX平台 -dorado 。根据笔者的经验，导致这种结果的根本原因并不在AJAX 。很多时候系统响应速度的降低都是由不够合理的界面设计和不够高效的编程习惯造成的。下面我们就来分析几个 AJAX 开发过程中需要时刻注意的环节。</p>
        <p>&lt;!-- [if !supportLists]--&gt;n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- [endif]--&gt;合理的使用AJAX客户端编程和远程过程调用。</p>
        <p>AJAX客户端的编程主要都是基于 JavaScript 的。而 JavaScript 是一种解释型的编程语言，它的运行效率相对于 Java 等都要稍逊一筹。同时 JavaScript 又是运行在浏览器这样一个严格受限的环境当中。因此开发人员对于哪些逻辑可以在客户端执行应该有一个清醒的认识。</p>
        <p>在实际的应用中究竟应该怎样使用 客户端编程，这依赖于开发人员的经验判断。这里很多问题是只可意会的。由于篇幅有限，在这里我们大致归纳出下面这几个注意事项：</p>
        <p>&lt;!-- [if !supportLists]--&gt;u&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- [endif]--&gt;尽可能避免频繁的使用远程过程调用，例如避免在循环体中使用远程过程调用。</p>
        <p>&lt;!-- [if !supportLists]--&gt;u&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- [endif]--&gt;如果可能的话尽可能使用 AJAX 方式的远程过程调用（异步方式的远程过程调用）。</p>
        <p>&lt;!-- [if !supportLists]--&gt;u&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- [endif]--&gt;避免将重量级的数据操作放置在 客户端。例如：大批量的数据复制操作、需要通过大量的数据遍历完成的计算等。</p>
        <p>&lt;!-- [if !supportLists]--&gt;n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- [endif]--&gt;改进对 DOM 对象的操作方式。</p>
        <p>客户端的编程中，对 DOM 对象的操作往往是最容易占用 CPU 时间的。而对于 DOM 对象的操作，不同的编程方法之间的性能差异又往往是非常大的。</p>
        <p>以下是三段运行结果完全相同的代码，它们的作用是在网页中创建一个 10x1000 的表格。然而它们的运行速度却有着天壤之别。</p>
        <pre>
        <ol>
            <li>/*&nbsp;测试代码&nbsp;1&nbsp;-&nbsp;耗时&nbsp;:&nbsp;41&nbsp;秒&nbsp;*/&nbsp; &nbsp;</li>
            <li>var&nbsp;<font color="#ff0000">table</font>&nbsp;=&nbsp;<font color="#0000ff">document</font>.createElement("TABLE");&nbsp; &nbsp;</li>
            <li>document.body.appendChild(table);&nbsp; &nbsp;</li>
            <li>for(var&nbsp;<font color="#ff0000">i</font>&nbsp;=&nbsp;<font color="#0000ff">0</font>;&nbsp;i&nbsp;<strong><font color="#006699">&lt;</font></strong>&nbsp;<strong><font color="#006699">1000</font></strong>;&nbsp;i++){&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;var&nbsp;<font color="#ff0000">row</font>&nbsp;=&nbsp;<font color="#0000ff">table</font>.insertRow(-1);&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;for(var&nbsp;<font color="#ff0000">j</font>&nbsp;=&nbsp;<font color="#0000ff">0</font>;&nbsp;j&nbsp;<strong><font color="#006699">&lt;</font></strong>&nbsp;<strong><font color="#006699">10</font></strong>;&nbsp;j++){&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;<font color="#ff0000">cell</font>&nbsp;=&nbsp;<font color="#0000ff">objRow</font>.insertCell(-1);&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff0000">cell.innerText</font>&nbsp;=&nbsp;<font color="#0000ff">"(&nbsp;"</font>&nbsp;+&nbsp;i&nbsp;+&nbsp;"&nbsp;,&nbsp;"&nbsp;+&nbsp;j&nbsp;+&nbsp;"&nbsp;)";&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;}&nbsp; &nbsp;</li>
            <li>}&nbsp; &nbsp;</li>
            <li>/*&nbsp;测试代码&nbsp;2&nbsp;-&nbsp;耗时&nbsp;:&nbsp;7.6&nbsp;秒&nbsp;*/&nbsp; &nbsp;</li>
            <li>var&nbsp;<font color="#ff0000">table</font>&nbsp;=&nbsp;<font color="#0000ff">document</font>.getElementById("TABLE");&nbsp; &nbsp;</li>
            <li>document.body.appendChild(table);&nbsp; &nbsp;</li>
            <li>var&nbsp;<font color="#ff0000">tbody</font>&nbsp;=&nbsp;<font color="#0000ff">document</font>.createElement("TBODY");&nbsp; &nbsp;</li>
            <li>table.appendChild(tbody);&nbsp; &nbsp;</li>
            <li>for(var&nbsp;<font color="#ff0000">i</font>&nbsp;=&nbsp;<font color="#0000ff">0</font>;&nbsp;i&nbsp;<strong><font color="#006699">&lt;</font></strong>&nbsp;<strong><font color="#006699">1000</font></strong>;&nbsp;i++){&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;var&nbsp;<font color="#ff0000">row</font>&nbsp;=&nbsp;<font color="#0000ff">document</font>.createElement("TR");&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;tbody.appendChild(row);&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;for(var&nbsp;<font color="#ff0000">j</font>&nbsp;=&nbsp;<font color="#0000ff">0</font>;&nbsp;j&nbsp;<strong><font color="#006699">&lt;</font></strong>&nbsp;<strong><font color="#006699">10</font></strong>;&nbsp;j++){&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;<font color="#ff0000">cell</font>&nbsp;=&nbsp;<font color="#0000ff">document</font>.createElement("TD");&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;row.appendChild(cell);&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff0000">cell.innerText</font>&nbsp;=&nbsp;<font color="#0000ff">"(&nbsp;"</font>&nbsp;+&nbsp;i&nbsp;+&nbsp;"&nbsp;,&nbsp;"&nbsp;+&nbsp;j&nbsp;+&nbsp;"&nbsp;)";&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;}&nbsp; &nbsp;</li>
            <li>}&nbsp; &nbsp;</li>
            <li>/*&nbsp;测试代码&nbsp;3&nbsp;-&nbsp;耗时&nbsp;:&nbsp;1.26&nbsp;秒&nbsp;*/&nbsp; &nbsp;</li>
            <li>var&nbsp;<font color="#ff0000">tbody</font>&nbsp;=&nbsp;<font color="#0000ff">document</font>.createElement("TBODY");&nbsp; &nbsp;</li>
            <li>for(var&nbsp;<font color="#ff0000">i</font>&nbsp;=&nbsp;<font color="#0000ff">0</font>;&nbsp;i&nbsp;<strong><font color="#006699">&lt;</font></strong>&nbsp;<strong><font color="#006699">1000</font></strong>;&nbsp;i++){&nbsp;&nbsp;&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;var&nbsp;<font color="#ff0000">row</font>&nbsp;=&nbsp;<font color="#0000ff">document</font>.createElement("TR");&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(var&nbsp;<font color="#ff0000">j</font>&nbsp;=&nbsp;<font color="#0000ff">0</font>;&nbsp;j&nbsp;<strong><font color="#006699">&lt;</font></strong>&nbsp;<strong><font color="#006699">10</font></strong>;&nbsp;j++){&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;<font color="#ff0000">cell</font>&nbsp;=&nbsp;<font color="#0000ff">document</font>.createElement("TD");&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff0000">cell.innerText</font>&nbsp;=&nbsp;<font color="#0000ff">"(&nbsp;"</font>&nbsp;+&nbsp;i&nbsp;+&nbsp;"&nbsp;,&nbsp;"&nbsp;+&nbsp;j&nbsp;+&nbsp;"&nbsp;)";&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;row.appendChild(cell);&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;}&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;tbody.appendChild(row);&nbsp; &nbsp;</li>
            <li>}&nbsp; &nbsp;</li>
            <li>var&nbsp;<font color="#ff0000">table</font>&nbsp;=&nbsp;<font color="#0000ff">document</font>.getElementById("TABLE");&nbsp; &nbsp;</li>
            <li>table.appendChild(tbody);&nbsp; &nbsp;</li>
            <li>document.body.appendChild(table);&nbsp;&nbsp;</li>
        </ol>
        </pre>
        <p>这里的&#8220;测试代码 1 &#8221;和&#8220;测试代码 2 &#8221;之间的差别在于在创建表格单元时使用了不同的 API 方法。而&#8220;测试代码 2 &#8221;和&#8220;测试代码 3 &#8221; 之间的差别在于处理顺序的略微不同。</p>
        <p>&#8220;测试代码 1 &#8221;和&#8220;测试代码 2 &#8221;之间如此大的性能差别我们无从分析，目前所知的是 insertRow 和 insertCell 是 DHTML 中表格特有的 API ， createElement 和 appendChild 是 W3C DOM 的原生 API 。而前者应该是对后者的封装。不过，我们并不能因此而得出结论认为 DOM 的原生 API 总是优于对象特有的 API 。建议大家在需要频繁调用某一 API 时，对其性能表现做一些基本的测试。</p>
        <p>&#8220;测试代码 2 &#8221;和&#8220;测试代码 3 &#8221;之间的性能差异主要来自于他们的构建顺序不同。&#8220;测试代码 2 &#8221;的做法是首先创建最外层的 &lt;TABLE&gt; 对象，然后再在循环中依次创建 &lt;TR&gt; 和 &lt;TD&gt; 。而&#8220;测试代码 3 &#8221;的做法是首先在内存中由内到外的构建好整个表格，最后再将它添加到网页中。这样做的目的是尽可能的减少浏览器重新计算页面布局的次数。每当我们将一个对象添加到网页中时，浏览器都会尝试对页面中的控件的布局进行重新计算。所以，如果我们能够首先在内存中将整个要构造的对象全部创建好，然后再一次性的添加到网页中。那么，浏览器将只会做一次布局的重计算 。总结为一句话那就是越晚执行 appendChild 越好。有时为了提高运行效率，我们甚至可以考虑先使用 removeChild 将已存在的控件从页面中移除，然后构造完成后再重新将其放置回页面当中。</p>
        <p>&lt;!-- [if !supportLists]--&gt;n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- [endif]--&gt;提高字符串累加的速度</p>
        <p>在使用 AJAX 提交信息时，我可能常常需要拼装一些比较大的字符串通过 XmlHttp 来完成 POST 提交。尽管提交这样大的信息的做法看起来并不优雅，但有时我们可能不得不面对这样的需求。那么 JavaScript 中对字符串的累加速度如何呢？我们先来做下面的这个实验。累加一个长度为 30000 的字符串。</p>
        <pre>
        <ol>
            <li>/*&nbsp;测试代码&nbsp;1&nbsp;-&nbsp;耗时&nbsp;:&nbsp;14.325&nbsp;秒&nbsp;*/&nbsp;&nbsp; &nbsp;</li>
            <li>var&nbsp;<font color="#ff0000">str</font>&nbsp;=&nbsp;<font color="#0000ff">""</font>;&nbsp; &nbsp;</li>
            <li>for&nbsp;(var&nbsp;<font color="#ff0000">i</font>&nbsp;=&nbsp;<font color="#0000ff">0</font>;&nbsp;i&nbsp;<strong><font color="#006699">&lt;</font></strong>&nbsp;<strong><font color="#006699">50000</font></strong>;&nbsp;i++)&nbsp;{&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;+=&nbsp;"xxxxxx";&nbsp; &nbsp;</li>
            <li>}&nbsp;&nbsp;</li>
        </ol>
        </pre>
        <p>这段代码耗时 14.325 秒，结果并不理想。现在我们将代码改为如下的形式：</p>
        <pre>
        <ol>
            <li>/*&nbsp;测试代码&nbsp;2&nbsp;-&nbsp;耗时&nbsp;:&nbsp;0.359&nbsp;秒&nbsp;*/&nbsp;&nbsp; &nbsp;</li>
            <li>var&nbsp;<font color="#ff0000">str</font>&nbsp;=&nbsp;<font color="#0000ff">""</font>;&nbsp; &nbsp;</li>
            <li>for&nbsp;(var&nbsp;<font color="#ff0000">i</font>&nbsp;=&nbsp;<font color="#0000ff">0</font>;&nbsp;i&nbsp;<strong><font color="#006699">&lt;</font></strong>&nbsp;<strong><font color="#006699">100</font></strong>;&nbsp;i++)&nbsp;{&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;<font color="#ff0000">sub</font>&nbsp;=&nbsp;<font color="#0000ff">""</font>;&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(var&nbsp;<font color="#ff0000">j</font>&nbsp;=&nbsp;<font color="#0000ff">0</font>;&nbsp;j&nbsp;<strong><font color="#006699">&lt;</font></strong>&nbsp;<strong><font color="#006699">500</font></strong>;&nbsp;j++)&nbsp;{&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sub&nbsp;+=&nbsp;"xxxxxx";&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;+=&nbsp;sub;&nbsp; &nbsp;</li>
            <li>}&nbsp;&nbsp;</li>
        </ol>
        </pre>
        <p>这段代码耗时 0.359 秒！同样的结果，我们做的只是首先拼装一些较小的字符串然后再组装成更大的字符串。这种做法可以有效的在字符串拼装的后期减小内存复制的数据量。知道了这一原理之后我们还可以把上面的代码进一步拆散以后进行测试。下面的代码仅耗时 0.140 秒。</p>
        <pre>
        <ol>
            <li>/*&nbsp;测试代码&nbsp;3&nbsp;-&nbsp;耗时&nbsp;:&nbsp;0.140&nbsp;秒&nbsp;*/&nbsp; &nbsp;</li>
            <li>var&nbsp;<font color="#ff0000">str</font>&nbsp;=&nbsp;<font color="#0000ff">""</font>;&nbsp;&nbsp; &nbsp;</li>
            <li>for&nbsp;(var&nbsp;<font color="#ff0000">i1</font>&nbsp;=&nbsp;<font color="#0000ff">0</font>;&nbsp;i1&nbsp;<strong><font color="#006699">&lt;</font></strong>&nbsp;<strong><font color="#006699">5</font></strong>;&nbsp;i1++)&nbsp;{&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;<font color="#ff0000">str1</font>&nbsp;=&nbsp;<font color="#0000ff">""</font>;&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(var&nbsp;<font color="#ff0000">i2</font>&nbsp;=&nbsp;<font color="#0000ff">0</font>;&nbsp;i2&nbsp;<strong><font color="#006699">&lt;</font></strong>&nbsp;<strong><font color="#006699">10</font></strong>;&nbsp;i2++)&nbsp;{&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;<font color="#ff0000">str2</font>&nbsp;=&nbsp;<font color="#0000ff">""</font>;&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(var&nbsp;<font color="#ff0000">i3</font>&nbsp;=&nbsp;<font color="#0000ff">0</font>;&nbsp;i3&nbsp;<strong><font color="#006699">&lt;</font></strong>&nbsp;<strong><font color="#006699">10</font></strong>;&nbsp;i3++)&nbsp;{&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;<font color="#ff0000">str3</font>&nbsp;=&nbsp;<font color="#0000ff">""</font>;&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(var&nbsp;<font color="#ff0000">i4</font>&nbsp;=&nbsp;<font color="#0000ff">0</font>;&nbsp;i4&nbsp;<strong><font color="#006699">&lt;</font></strong>&nbsp;<strong><font color="#006699">10</font></strong>;&nbsp;i4++)&nbsp;{&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;<font color="#ff0000">str4</font>&nbsp;=&nbsp;<font color="#0000ff">""</font>;&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(var&nbsp;<font color="#ff0000">i5</font>&nbsp;=&nbsp;<font color="#0000ff">0</font>;&nbsp;i5&nbsp;<strong><font color="#006699">&lt;</font></strong>&nbsp;<strong><font color="#006699">10</font></strong>;&nbsp;i5++)&nbsp;{&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str4&nbsp;+=&nbsp;"xxxxxx";&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str3&nbsp;+=&nbsp;str4;&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str2&nbsp;+=&nbsp;str3;&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str1&nbsp;+=&nbsp;str2;&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;+=&nbsp;str1;&nbsp;&nbsp;&nbsp; &nbsp;</li>
            <li>}&nbsp;&nbsp;</li>
        </ol>
        </pre>
        <p>不过，上面这种做法也许并不是最好的！如果我们需要提交的信息是 XML 格式的（其实绝大多数情况下，我们都可以设法将要提交的信息组装成 XML 格式），我们还能找到更高效更优雅的方法 &#8212; 利用 DOM 对象为我们组装字符串。下面这段代买组装一个长度为 950015 的字符串仅须耗时 0.890 秒。</p>
        <pre>
        <ol>
            <li>/*&nbsp;利用&nbsp;DOM&nbsp;对象组装信息&nbsp;-&nbsp;耗时&nbsp;:&nbsp;0.890&nbsp;秒&nbsp;*/&nbsp; &nbsp;</li>
            <li>var&nbsp;xmlDoc;&nbsp;&nbsp;&nbsp; &nbsp;</li>
            <li>if&nbsp;(<font color="#ff0000">browserType</font>&nbsp;==&nbsp;BROWSER_IE)&nbsp;{&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff0000">xmlDoc</font>&nbsp;=&nbsp;<font color="#0000ff">new</font>&nbsp;ActiveXObject("Msxml.DOMDocument");&nbsp; &nbsp;</li>
            <li>}&nbsp; &nbsp;</li>
            <li>else&nbsp;{&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff0000">xmlDoc</font>&nbsp;=&nbsp;<font color="#0000ff">document</font>.createElement("DOM");&nbsp; &nbsp;</li>
            <li>}&nbsp; &nbsp;</li>
            <li>var&nbsp;<font color="#ff0000">root</font>&nbsp;=&nbsp;<font color="#0000ff">xmlDoc</font>.createElement("root");&nbsp; &nbsp;</li>
            <li>for&nbsp;(var&nbsp;<font color="#ff0000">i</font>&nbsp;=&nbsp;<font color="#0000ff">0</font>;&nbsp;i&nbsp;<strong><font color="#006699">&lt;</font></strong>&nbsp;<strong><font color="#006699">50000</font></strong>;&nbsp;i++)&nbsp;{&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;<font color="#ff0000">node</font>&nbsp;=&nbsp;<font color="#0000ff">xmlDoc</font>.createElement("data");&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(<font color="#ff0000">browserType</font>&nbsp;==&nbsp;BROWSER_IE)&nbsp;{&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff0000">node.text</font>&nbsp;=&nbsp;<font color="#0000ff">"xxxxxx"</font>;&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;{&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff0000">node.innerText</font>&nbsp;=&nbsp;<font color="#0000ff">"xxxxxx"</font>;&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root.appendChild(node);&nbsp; &nbsp;</li>
            <li>}&nbsp; &nbsp;</li>
            <li>xmlDoc.appendChild(root);&nbsp; &nbsp;</li>
            <li>var&nbsp;str;&nbsp; &nbsp;</li>
            <li>if&nbsp;(<font color="#ff0000">browserType</font>&nbsp;==&nbsp;BROWSER_IE)&nbsp;{&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff0000">str</font>&nbsp;=&nbsp;<font color="#0000ff">xmlDoc</font>.xml;&nbsp; &nbsp;</li>
            <li>}&nbsp; &nbsp;</li>
            <li>else&nbsp;{&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff0000">str</font>&nbsp;=&nbsp;<font color="#0000ff">xmlDoc</font>.innerHTML;&nbsp; &nbsp;</li>
            <li>}&nbsp; &nbsp;</li>
            <li><font color="#008200">&lt;!--&nbsp;[if&nbsp;!supportLists]--&gt;</font>n&nbsp;&nbsp;&nbsp;</li>
        </ol>
        </pre>
        <p>&lt;!-- [endif]--&gt;避免 DOM 对象的内存泄漏。</p>
        <p>关于 IE 中 DOM 对象的内存泄露是一个常常被开发人员忽略的问题。然而它带来的后果却是非常严重的！它会导致 IE 的内存占用量持续上升，并且浏览器的整体运行速度明显下降。对于一些泄露比较严重的网页，甚至只要刷新几次，运行速度就会降低一倍。</p>
        <p>比较常见的内存泄漏的模型有&#8220; 循环引用 模型&#8221;、&#8220; 闭包函数 模型&#8221;和&#8220; DOM 插入顺序模型&#8221; , 对于前两种泄漏模型，我们都可以通过在网页析构时解除引用的方式来避免。而对于&#8220; DOM 插入顺序模型&#8221;则需要通过改变一些惯有的编程习惯的方式来避免。</p>
        <p>有关内存泄漏的模型的更多介绍可以通过 Google 很快的查到，本文不做过多的阐述。不过，这里我向您推荐一个可用于查找和分析网页内存泄露的小工具 &#8212; Drip ，目前的较新版本是 0.5 ，下载地址是 http://outofhanwell.com/ieleak/index.php</p>
        <p>&lt;!-- [if !supportLists]--&gt;n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- [endif]--&gt;复杂页面的分段装载和初始化</p>
        <p>对系统当中某些确实比较复杂而又不便使用 IFrame 的界面，我们可以对其实施分段装载。例如对于多页标签的界面，我们可以首先下载和初始化多页标签的默认页，然后利用 AJAH （ asynchronous JavaScript and HTML ）技术来异步的装载其他标签页中的内容。这样就能保证界面可以在第一时间首先展现给用户。把整个复杂界面的装载过程分散到用户的操作过程当中。</p>
        <p>&lt;!-- [if !supportLists]--&gt;n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- [endif]--&gt;利用 GZIP 压缩网络流量。</p>
        <p>除了上面提到的这些代码级的改良之外，我们还可以利用 GZIP 来有效的降低网络流量。目前常见的主流浏览器已经全部支持 GZIP 算法，我们往往只需要编写少量的代码就可以支持 GZIP 了。例如在 J2EE 中我们可以在 Filter 中通过下面的代码来判断客户端浏览器是否支持 GZIP 算法，然后根据需要利用 java.util.zip.GZIPOutputStream 来实现 GZIP 的输出。</p>
        <pre>
        <ol>
            <li>/*&nbsp;判断浏览器对&nbsp;GZIP&nbsp;支持方式的代码&nbsp;*/&nbsp; &nbsp;</li>
            <li>private&nbsp;static&nbsp;String&nbsp;getGZIPEncoding(HttpServletRequest&nbsp;request)&nbsp;{&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;String&nbsp;<font color="#ff0000">acceptEncoding</font>&nbsp;=&nbsp;<font color="#0000ff">request</font>.getHeader("Accept-Encoding");&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;if&nbsp;(<font color="#ff0000">acceptEncoding</font>&nbsp;==&nbsp;null)&nbsp;return&nbsp;null;&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;<font color="#ff0000">acceptEncoding</font><font color="#0000ff">acceptEncoding</font>&nbsp;=&nbsp;acceptEncoding.toLowerCase();&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;if&nbsp;(acceptEncoding.indexOf("x-gzip")&nbsp;<strong><font color="#006699">&gt;</font></strong>=&nbsp;0)&nbsp;return&nbsp;"x-gzip";&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;if&nbsp;(acceptEncoding.indexOf("gzip")&nbsp;<strong><font color="#006699">&gt;</font></strong>=&nbsp;0)&nbsp;return&nbsp;"gzip";&nbsp; &nbsp;</li>
            <li>&nbsp;&nbsp;return&nbsp;null;&nbsp; &nbsp;</li>
            <li>}&nbsp;</li>
        </ol>
        </pre>
        <p>一般而言， GZIP 对于 HTML 、 JSP 的压缩比可以达到 80% 左右，而它造成的服务端和客户端的性能损耗几乎是可以忽略的。结合其他因素，支持 GZIP 的网站有可能为我们节约 50% 的网络流量。因此 GZIP 的使用可以为那些网络环境不是特别好的应用带来显著的性能提升。使用 Http 的监视工具 Fiddler 可以方便的检测出网页在使用 GZIP 前后的通讯数据量。 Fiddler 的下载地址是 http://www.fiddlertool.com/fiddler/</p>
        <p>关于 Web 应用的性能优化其实是一个非常大的话题。本文由于篇幅有限，只能涉及其中的几个细节，并且也无法将这些细节的优化方式全面的展现给大家。期望本文能够引起大家对 Web 应用尤其是客户端性能优化的充分重视。毕竟服务端编程技巧已为大家熟知多年，在服务端挖掘性能的潜力已经不大了。而在客户端的方法改进往往能够得到令人惊奇的性能提升。</p>
    </ul>
    <div>
    <ul></ul>
        </div>
        <ul>
            <p>&nbsp;</p>
        </ul><img src ="http://www.blogjava.net/nighthun/aggbug/350864.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nighthun/" target="_blank">风舞乱乱</a> 2011-05-23 18:07 <a href="http://www.blogjava.net/nighthun/articles/350864.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转贴] 谈不起恋爱的80后，看来我们真的是老了吗？</title><link>http://www.blogjava.net/nighthun/archive/2009/10/25/299693.html</link><dc:creator>风舞乱乱</dc:creator><author>风舞乱乱</author><pubDate>Sun, 25 Oct 2009 13:52:00 GMT</pubDate><guid>http://www.blogjava.net/nighthun/archive/2009/10/25/299693.html</guid><description><![CDATA[<h3 id="postsubject0">[<br />
<span id="postcontent0">现在的我们已经到了谈婚论嫁的年龄，<br />
但是身边好多同学和同事仍然是单身。<br />
当我问及他们的时候，回答都是：婚姻是件大事不敢太草率了，<br />
所以选自己另一半的时候更多的是理智。<br />
然而，好多没谈过恋爱的人还是期望自己能谈一场真正的恋爱，<br />
然后和自己心爱的人携手走入婚姻的殿堂。<br />
但是谈恋爱对80年代的我们来说已经成为一种奢侈，<br />
有这种想法的人恐怕不只是我一个人，因为我们都谈不起恋爱了。<br />
不管谈过还是没谈过，都不敢把太多的感情放在恋爱上，<br />
因为害怕失败，我们已经承受不起。 <br />
<br style="line-height: 0px" />
<span style="display: none">[::艾泽拉斯国家地理 BBS.NGACN.CC::]</span><br style="line-height: 0px" />
<br />
有同事去相亲，有时不错，回来后就经常联系。但是她说找不到恋爱的感觉，更像是朋友，<br />
他们不会付出太多的感情，也不会对你太好。<br />
是啊，可以理解，<br />
因为男人们也害怕，他们同样不敢去尝试，<br />
害怕自己是剃头挑子一头热。<br />
姐妹们谈起婚姻的时候总是在说，找个对自己好的男人就嫁了吧，<br />
不管自己喜不喜欢，结婚后也会对他好，<br />
生个小Baby踏踏实实过一辈子。<br />
男性朋友则是找个会过日子的女人，<br />
好好待她，安安稳稳过日子就好了，<br />
因为在外面打拼真的很累，想有个温暖家。<br />
才发现恋爱已经离我们远去，<br />
剩下的只是婚姻、生活、日子。 <br />
<br />
想想我们的这些80后的人们，爱情远离我们，结婚又像是完成使命一样，<br />
经济条件也不是那么重要，<br />
找个男人(女人)踏踏实实过日子才是我们的宗旨。<br />
当妹妹告诉我她们宿舍的女孩如何如何谈恋爱，<br />
如何如何换男朋友，如何如何浪漫，<br />
我只能感慨&#8220;你们还有谈恋爱的资本和勇气。&#8221;<br />
妹妹说你也不老啊，别总把自己想的那么老，赶快给我找个姐夫。<br />
我们并不是承认自己老，至少我这样认为，但是爱情观和婚姻观还是大不一样的。 <br />
<br />
当有朋友问起我什么时候结婚？我说连男朋友还没有和谁结婚啊？&#8220;那找一个嘛！&#8221; <br />
&#8220;又不是逛商场，说找个就找个？&#8221;&#8220;哎呀，要求不要那么高啊！&#8221;<br />
其实我也和姐妹们一样的想法找个仅仅对我好的就好了，<br />
相貌、学历、经济都不重要，重要的是个人能力。<br />
&#8220;三高政策&#8221;也只是我们茶余饭后开的玩笑话罢了。<br />
姐妹们经常说，当真正有一个疼我们、爱我们的人摆在面前的时候，<br />
我们一定好好珍惜。<br />
是现在的好男人少了吗？<br />
不是，我不这样认为，好男人还是很多的，<br />
只是我们没有发觉又或者是发觉了没有勇气去说服自己。<br />
好多女孩都是放不下自己矜持，总认为男孩应该主动。<br />
因为我们不像90年代的人们敢爱敢恨，<br />
可以大胆说出自己的爱，哪怕是被拒绝。<br />
至少我身边的好多朋友都是这样，错过了好多好男人，<br />
当自己心爱的男人成为别人的老公的时候，<br />
而且是通过别人介绍结婚的时候，<br />
我们只能偷偷的抹一把泪，为他们祝福。<br />
又或者关几天自己禁闭，故事的结局往往是那么伤感。<br />
为什么我们宁愿彼此都受伤，也不愿意把心中的爱说出来呢？<br />
因为我们总是不确定对方心里是否有我们。<br />
所以我们总是在矛盾中把自己的恋爱丢掉了，<br />
不知不觉就来到了结婚的年龄。<br />
<br />
可是此时我们真的已经谈不起恋爱了！ <br />
<br />
喜欢隐身了，<br />
不怎么爱在群里发言了,<br />
不论和多少人在一块，手机总挂着QQ，<br />
一堆人聚在一块，一人一台手机，各玩各的。<br />
同学聚会必修的两个项目：吃饭，KTV<br />
小孩都开始叫自己叔叔或者阿姨了，<br />
虽然经常不大情愿地反驳着：叫姐姐，叫哥哥<br />
永远寂寞，不管你是一人独处时，还是身在人群当中，<br />
就像那首歌中唱的一样，孤单，是一个人的狂欢，狂欢，是一群人的孤单。<br />
没那么愤青了，遇到不公的时候，会告诉自己，社会就是这样，<br />
可以不看电视，但电脑是必需品，<br />
出门蹦达必带三件宝：手机，钥匙，钱<br />
永远不知道钱花哪了，没怎么吃，没怎么穿<br />
消极，拒绝长大。<br />
不喜欢被人说成熟，<br />
熟人面前是话唠，生人面前一言不发，<br />
爱好中必定有一项是睡觉，<br />
成天泡在网上，又不知道做什么好。<br />
最常说的一句话是&#8220;无聊&#8221;,<br />
尽管，他们在网络上，花去了大把时间。<br />
减肥是永恒不变的话题和行动，<br />
饿了就吃，经常早饭午饭并在一起吃，<br />
打字的手法相当不准确，但还是打的很快。<br />
凌晨12点前很少会入睡，<br />
什么都可以&#8220;随便&#8221;，因为没那么多时间，也不在意那么多的事情。<br />
毫无理由没有资本的高傲，骨子里却自卑，期待肯定，期待认可，被讨厌做人失败的时候连说话的勇气都没有。<br />
觉得别人不可能了解自己，并以此作为对别人不屑的理由。<br />
因为别人都恋爱了，所以自己就恋爱了，更多的是练爱而不是恋爱，然后连自己都开始怀疑曾经对爱情的 坚持。<br />
曾经以为一辈子陪在身边的朋友，某天某月，就突然发现他们都不见了。<br />
午夜醒来，才愕然发现，从来都是只有自己一个人，<br />
人越成长，越容易孤单。<br />
<br />
80后的我们，有很多的梦想，有的实现了有的破灭了。<br />
80后的我们，有的出名，有的默默无闻。<br />
80后的我们，挣扎过 彷徨过，还是挺过来了。<br />
80后的我们，退去青春年幼的智嫩，开始适应社会大家庭。<br />
我们的心里都很清楚，我们经历了太多太多。<br />
亲情的分与合，<br />
爱情的分与合，<br />
友情的分与合，<br />
曾不顾一切的追求过的，后来变的一文不值得。<br />
父母曾百般阻挠的事，直到自己受伤，才明白，父母原来是对的。<br />
曾无数次的问过自己，为什 么活着？<br />
到后来，已经懒得的去想活着的意义。<br />
曾为了爱情可以不好好的读书，<br />
到后来为了工作可以丢下爱情。<br />
现在是否还记得最初的梦想？<br />
或者说， 还有多少人，一直坚持着自己年少时的梦想。<br />
在家里，父母对我们百依百顺，<br />
出了家门，我们对社会百依百顺。<br />
看不惯的事情也就渐渐习惯了，不知道这种习惯是好是坏？<br />
我甚至不知道我现在的梦想应该是什么？<br />
但有一点的是肯定的，<br />
不会再做一些年少轻狂的梦了......</span> <script type="text/javascript">
				bbscode('postcontent0',0,'0',1,0,2849481,"tpc",1878180);
			</script></h3>
<img src ="http://www.blogjava.net/nighthun/aggbug/299693.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nighthun/" target="_blank">风舞乱乱</a> 2009-10-25 21:52 <a href="http://www.blogjava.net/nighthun/archive/2009/10/25/299693.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java 拼接文字和图片</title><link>http://www.blogjava.net/nighthun/archive/2009/10/14/298154.html</link><dc:creator>风舞乱乱</dc:creator><author>风舞乱乱</author><pubDate>Wed, 14 Oct 2009 02:11:00 GMT</pubDate><guid>http://www.blogjava.net/nighthun/archive/2009/10/14/298154.html</guid><description><![CDATA[<p>public static void test2() {<br />
&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;// 读取第一张图片<br />
&nbsp;&nbsp;&nbsp;// File fileOne = new File("D:\\qq.jpg");<br />
&nbsp;&nbsp;&nbsp;// BufferedImage ImageOne = ImageIO.read(fileOne);<br />
&nbsp;&nbsp;&nbsp;// int width = ImageOne.getWidth();//图片宽度<br />
&nbsp;&nbsp;&nbsp;// int height = ImageOne.getHeight();//图片高度</p>
<p>&nbsp;&nbsp;&nbsp;// 对第二张图片做相同的处理<br />
&nbsp;&nbsp;&nbsp;File fileTwo = new File("D:\\qq.jpg");<br />
&nbsp;&nbsp;&nbsp;BufferedImage ImageTwo = ImageIO.read(fileTwo);</p>
<p>&nbsp;&nbsp;&nbsp;int width = ImageTwo.getWidth();// 图片宽度<br />
&nbsp;&nbsp;&nbsp;int height = ImageTwo.getHeight();// 图片高度<br />
&nbsp;&nbsp;&nbsp;int height2 = 20;</p>
<p>&nbsp;&nbsp;&nbsp;BufferedImage ImageOne = new BufferedImage(width, height2,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedImage.TYPE_4BYTE_ABGR);<br />
&nbsp;&nbsp;&nbsp;// ImageOne.get</p>
<p>&nbsp;&nbsp;&nbsp;Graphics g = ImageOne.getGraphics();//&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;g.fillRect(0, 0, width, height);<br />
&nbsp;&nbsp;&nbsp;g.setColor(Color.blue);<br />
&nbsp;&nbsp;&nbsp;Font mFont = new Font("宋体", Font.PLAIN, 12);<br />
&nbsp;&nbsp;&nbsp;g.setFont(mFont);<br />
&nbsp;&nbsp;&nbsp;String text = "添加文字测试";<br />
&nbsp;&nbsp;&nbsp;g.drawString(text, 0, 10);<br />
&nbsp;&nbsp;&nbsp;// 从图片中读取RGB<br />
&nbsp;&nbsp;&nbsp;int[] ImageArrayOne = new int[width * height2];<br />
&nbsp;&nbsp;&nbsp;ImageArrayOne = ImageOne.getRGB(0, 0, width, height2,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ImageArrayOne, 0, width);</p>
<p>&nbsp;&nbsp;&nbsp;int[] ImageArrayTwo = new int[width * height];<br />
&nbsp;&nbsp;&nbsp;ImageArrayTwo = ImageTwo.getRGB(0, 0, width, height, ImageArrayTwo,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0, width);</p>
<p>&nbsp;&nbsp;&nbsp;// 生成新图片<br />
&nbsp;&nbsp;&nbsp;BufferedImage ImageNew = new BufferedImage(width, height + height2,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedImage.TYPE_INT_RGB);<br />
&nbsp;&nbsp;&nbsp;ImageNew.setRGB(0, 0, width, height2, ImageArrayOne, 0, width);// 设置上半部分的RGB<br />
&nbsp;&nbsp;&nbsp;// ImageNew.setRGB(width,0,width,height,ImageArrayTwo,0,width);//设置右半部分的RGB<br />
&nbsp;&nbsp;&nbsp;ImageNew.setRGB(0, height2, width, height, ImageArrayTwo, 0, width);// 设置下半部分的RGB</p>
<p>&nbsp;&nbsp;&nbsp;File outFile = new File("d:\\qq2.jpg");<br />
&nbsp;&nbsp;&nbsp;ImageIO.write(ImageNew, "jpg", outFile);// 写图片<br />
&nbsp;&nbsp;} catch (Exception e) {<br />
&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;}<br />
&nbsp;}</p>
 <img src ="http://www.blogjava.net/nighthun/aggbug/298154.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nighthun/" target="_blank">风舞乱乱</a> 2009-10-14 10:11 <a href="http://www.blogjava.net/nighthun/archive/2009/10/14/298154.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JS获取屏幕，浏览器，网页高度宽度[转]</title><link>http://www.blogjava.net/nighthun/archive/2009/06/26/284318.html</link><dc:creator>风舞乱乱</dc:creator><author>风舞乱乱</author><pubDate>Fri, 26 Jun 2009 09:31:00 GMT</pubDate><guid>http://www.blogjava.net/nighthun/archive/2009/06/26/284318.html</guid><description><![CDATA[转自源码网<br />
<br />
网页可见区域宽：document.body.clientWidth <br />
网页可见区域高：document.body.clientHeight <br />
网页可见区域宽：document.body.offsetWidth (包括边线的宽) <br />
网页可见区域高：document.body.offsetHeight (包括边线的宽) <br />
网页正文全文宽：document.body.scrollWidth <br />
网页正文全文高：document.body.scrollHeight <br />
网页被卷去的高：document.body.scrollTop <br />
网页被卷去的左：document.body.scrollLeft <br />
网页正文部分上：window.screenTop <br />
网页正文部分左：window.screenLeft <br />
屏幕分辨率的高：window.screen.height <br />
屏幕分辨率的宽：window.screen.width <br />
屏幕可用工作区高度：window.screen.availHeight <br />
屏幕可用工作区宽度：window.screen.availWidth <br />
<br />
<br />
HTML精确定位:scrollLeft,scrollWidth,clientWidth,offsetWidth <br />
scrollHeight: 获取对象的滚动高度。 <br />
scrollLeft:设置或获取位于对象左边界和窗口中目前可见内容的最左端之间的距离 <br />
scrollTop:设置或获取位于对象最顶端和窗口中可见内容的最顶端之间的距离 <br />
scrollWidth:获取对象的滚动宽度 <br />
offsetHeight:获取对象相对于版面或由父坐标 offsetParent 属性指定的父坐标的高度 <br />
offsetLeft:获取对象相对于版面或由 offsetParent 属性指定的父坐标的计算左侧位置 <br />
offsetTop:获取对象相对于版面或由 offsetTop 属性指定的父坐标的计算顶端位置 <br />
event.clientX 相对文档的水平座标 <br />
event.clientY 相对文档的垂直座标 <br />
event.offsetX 相对容器的水平坐标 <br />
event.offsetY 相对容器的垂直坐标 <br />
document.documentElement.scrollTop 垂直方向滚动的值 <br />
event.clientX+document.documentElement.scrollTop 相对文档的水平座标+垂直方向滚动的量 <br />
<br />
IE，FireFox 差异如下： <br />
<br />
IE6.0、FF1.06+： <br />
<br />
clientWidth = width + padding <br />
<br />
clientHeight = height + padding <br />
<br />
offsetWidth = width + padding + border <br />
<br />
offsetHeight = height + padding + border <br />
<br />
IE5.0/5.5： <br />
clientWidth = width - border <br />
<br />
clientHeight = height - border <br />
<br />
offsetWidth = width <br />
<br />
offsetHeight = height <br />
<br />
(需要提一下：CSS中的margin属性，与clientWidth、offsetWidth、clientHeight、offsetHeight均无关) <br />
 <img src ="http://www.blogjava.net/nighthun/aggbug/284318.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nighthun/" target="_blank">风舞乱乱</a> 2009-06-26 17:31 <a href="http://www.blogjava.net/nighthun/archive/2009/06/26/284318.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>