??xml version="1.0" encoding="utf-8" standalone="yes"?>色一情一区二区三区四区,99国产精品99久久久久久,国产精品一区在线观看http://www.aygfsteel.com/nighthun/zh-cnFri, 20 Jun 2025 00:02:03 GMTFri, 20 Jun 2025 00:02:03 GMT60谈如何提高AJAX客户端响应速度http://www.aygfsteel.com/nighthun/archive/2011/05/23/350865.html风舞׃ؕ风舞׃ؕMon, 23 May 2011 10:08:00 GMThttp://www.aygfsteel.com/nighthun/archive/2011/05/23/350865.html谈如何提高AJAX客户端响应速度
    AJAX 的出现极大的改变?Web 应用客户端的操作模式Q它使的用户可以在全心工作时不必频繁的忍受那令h厌恶的页面刷新。理Z AJAX 技术在很大的程度上可以减少用户操作的等待时_同时节约|络上的数据量。而然Q实际情况却q不Lq样。用h怼抱怨用?AJAX 的系l响应速度反而降低了。本文将谈谈如何提高响应速度?/ul>

     

    W者从事AJAX 斚w的研发多q_参与开发了目前国内较ؓ成熟的AJAXq_ -dorado 。根据笔者的l验Q导致这U结果的Ҏ原因q不在AJAX 。很多时候系l响应速度的降低都是由不够合理的界面设计和不够高效的编E习惯造成的。下面我们就来分析几?AJAX 开发过E中需要时L意的环节?/p>

    <!-- [if !supportLists]-->n         <!-- [endif]-->合理的用AJAX客户端编E和q程q程调用?/p>

    AJAX客户端的~程主要都是Z JavaScript 的。?JavaScript 是一U解释型的编E语aQ它的运行效率相对于 Java {都要稍逊一{V同?JavaScript 又是q行在浏览器q样一个严格受限的环境当中。因此开发h员对于哪些逻辑可以在客L执行应该有一个清醒的认识?/p>

    在实际的应用中究竟应该怎样使用 客户端编E,q依赖于开发h员的l验判断。这里很多问题是只可意会的。由于篇q有限,在这里我们大致归U_下面q几个注意事:

    <!-- [if !supportLists]-->u       <!-- [endif]-->可能避免频J的使用q程q程调用Q例如避免在循环体中使用q程q程调用?/p>

    <!-- [if !supportLists]-->u       <!-- [endif]-->如果可能的话可能?AJAX 方式的远E过E调用(异步方式的远E过E调用)?/p>

    <!-- [if !supportLists]-->u       <!-- [endif]-->避免重量的数据操作放|在 客户端。例如:大批量的数据复制操作、需要通过大量的数据遍历完成的计算{?/p>

    <!-- [if !supportLists]-->n         <!-- [endif]-->改进?DOM 对象的操作方式?/p>

    客户端的~程中,?DOM 对象的操作往往是最Ҏ占用 CPU 旉的。而对?DOM 对象的操作,不同的编E方法之间的性能差异又往往是非常大的?/p>

    以下是三D运行结果完全相同的代码Q它们的作用是在|页中创Z?10x1000 的表根{然而它们的q行速度却有着天壤之别?/p>

            
    1. /* 试代码 1 - 耗时 : 41 U?nbsp;*/   
    2. var table = document.createElement("TABLE");   
    3. document.body.appendChild(table);   
    4. for(var i = 0; i < 1000; i++){   
    5.   var row = table.insertRow(-1);   
    6.   for(var j = 0; j < 10; j++){   
    7.     var cell = objRow.insertCell(-1);   
    8.       cell.innerText = "( " + i + " , " + j + " )";   
    9.   }   
    10. }   
    11. /* 试代码 2 - 耗时 : 7.6 U?nbsp;*/   
    12. var table = document.getElementById("TABLE");   
    13. document.body.appendChild(table);   
    14. var tbody = document.createElement("TBODY");   
    15. table.appendChild(tbody);   
    16. for(var i = 0; i < 1000; i++){   
    17.   var row = document.createElement("TR");   
    18.   tbody.appendChild(row);   
    19.   for(var j = 0; j < 10; j++){   
    20.     var cell = document.createElement("TD");   
    21.       row.appendChild(cell);   
    22.       cell.innerText = "( " + i + " , " + j + " )";   
    23.   }   
    24. }   
    25. /* 试代码 3 - 耗时 : 1.26 U?nbsp;*/   
    26. var tbody = document.createElement("TBODY");   
    27. for(var i = 0; i < 1000; i++){     
    28.   var row = document.createElement("TR");   
    29.        for(var j = 0; j < 10; j++){   
    30.     var cell = document.createElement("TD");   
    31.       cell.innerText = "( " + i + " , " + j + " )";   
    32.       row.appendChild(cell);   
    33.   }   
    34.   tbody.appendChild(row);   
    35. }   
    36. var table = document.getElementById("TABLE");   
    37. table.appendChild(tbody);   
    38. document.body.appendChild(table);  

    q里?#8220;试代码 1 ”?#8220;试代码 2 ”之间的差别在于在创徏表格单元时用了不同?API Ҏ。?#8220;试代码 2 ”?#8220;试代码 3 ” 之间的差别在于处理顺序的略微不同?/p>

    “试代码 1 ”?#8220;试代码 2 ”之间如此大的性能差别我们无从分析Q目前所知的?insertRow ?insertCell ?DHTML 中表格特有的 API Q?createElement ?appendChild ?W3C DOM 的原?API 。而前者应该是对后者的装。不q,我们q不能因此而得出结?DOM 的原?API L优于对象Ҏ?API 。徏议大家在需要频J调用某一 API Ӟ对其性能表现做一些基本的试?/p>

    “试代码 2 ”?#8220;试代码 3 ”之间的性能差异主要来自于他们的构徏序不同?#8220;试代码 2 ”的做法是首先创徏最外层?<TABLE> 对象Q然后再在@环中依次创徏 <TR> ?<TD> 。?#8220;试代码 3 ”的做法是首先在内存中由内到外的构建好整个表格Q最后再它d到网中。这样做的目的是可能的减少览器重新计页面布局的次数。每当我们将一个对象添加到|页中时Q浏览器都会试寚w面中的控件的布局q行重新计算。所以,如果我们能够首先在内存中整个要构造的对象全部创徏好,然后再一ơ性的d到网中。那么,览器将只会做一ơ布局的重计算 。ȝZ句话那就是越晚执?appendChild 好。有时ؓ了提高运行效率,我们甚至可以考虑先?removeChild 已存在的控件从面中移除,然后构造完成后再重新将其放|回面当中?/p>

    <!-- [if !supportLists]-->n         <!-- [endif]-->提高字符串篏加的速度

    在?AJAX 提交信息Ӟ我可能常帔R要拼装一些比较大的字W串通过 XmlHttp 来完?POST 提交。尽提交这样大的信息的做法看v来ƈ不优雅,但有时我们可能不得不面对q样的需求。那?JavaScript 中对字符串的累加速度如何呢?我们先来做下面的q个实验。篏加一个长度ؓ 30000 的字W串?/p>

            
    1. /* 试代码 1 - 耗时 : 14.325 U?nbsp;*/    
    2. var str = "";   
    3. for (var i = 0; i < 50000; i++) {   
    4.        str += "xxxxxx";   
    5. }  

    q段代码耗时 14.325 U,l果q不理想。现在我们将代码改ؓ如下的Ş式:

            
    1. /* 试代码 2 - 耗时 : 0.359 U?nbsp;*/    
    2. var str = "";   
    3. for (var i = 0; i < 100; i++) {   
    4.        var sub = "";   
    5.        for (var j = 0; j < 500; j++) {   
    6.               sub += "xxxxxx";   
    7.        }   
    8.        str += sub;   
    9. }  

    q段代码耗时 0.359 U!同样的结果,我们做的只是首先D一些较的字符串然后再l装成更大的字符丌Ӏ这U做法可以有效的在字W串D的后期减内存复制的数据量。知道了q一原理之后我们q可以把上面的代码进一步拆散以后进行测试。下面的代码仅耗时 0.140 U?/p>

            
    1. /* 试代码 3 - 耗时 : 0.140 U?nbsp;*/   
    2. var str = "";    
    3. for (var i1 = 0; i1 < 5; i1++) {   
    4.        var str1 = "";   
    5.        for (var i2 = 0; i2 < 10; i2++) {   
    6.               var str2 = "";   
    7.               for (var i3 = 0; i3 < 10; i3++) {   
    8.                      var str3 = "";   
    9.                      for (var i4 = 0; i4 < 10; i4++) {   
    10.                             var str4 = "";   
    11.                             for (var i5 = 0; i5 < 10; i5++) {   
    12.                                    str4 += "xxxxxx";   
    13.                             }   
    14.                             str3 += str4;   
    15.                      }   
    16.                      str2 += str3;   
    17.               }   
    18.               str1 += str2;   
    19.        }   
    20.        str += str1;     
    21. }  

    不过Q上面这U做法也许ƈ不是最好的Q如果我们需要提交的信息?XML 格式的(其实l大多数情况下,我们都可以设法将要提交的信息l装?XML 格式Q,我们q能扑ֈ更高效更优雅的方?— 利用 DOM 对象为我们组装字W串。下面这D代买组装一个长度ؓ 950015 的字W串仅须耗时 0.890 U?/p>

            
    1. /* 利用 DOM 对象l装信息 - 耗时 : 0.890 U?nbsp;*/   
    2. var xmlDoc;     
    3. if (browserType == BROWSER_IE) {   
    4.        xmlDoc = new ActiveXObject("Msxml.DOMDocument");   
    5. }   
    6. else {   
    7.        xmlDoc = document.createElement("DOM");   
    8. }   
    9. var root = xmlDoc.createElement("root");   
    10. for (var i = 0; i < 50000; i++) {   
    11.        var node = xmlDoc.createElement("data");   
    12.        if (browserType == BROWSER_IE) {   
    13.               node.text = "xxxxxx";   
    14.        }   
    15.        else {   
    16.               node.innerText = "xxxxxx";   
    17.        }   
    18.        root.appendChild(node);   
    19. }   
    20. xmlDoc.appendChild(root);   
    21. var str;   
    22. if (browserType == BROWSER_IE) {   
    23.        str = xmlDoc.xml;   
    24. }   
    25. else {   
    26.        str = xmlDoc.innerHTML;   
    27. }   
    28. <!-- [if !supportLists]-->n   

    <!-- [endif]-->避免 DOM 对象的内存泄漏?/p>

    关于 IE ?DOM 对象的内存泄露是一个常常被开发h员忽略的问题。然而它带来的后果却是非怸重的Q它会导?IE 的内存占用量持箋上升Qƈ且浏览器的整体运行速度明显下降。对于一些泄露比较严重的|页Q甚臛_要刷新几ơ,q行速度׃降低一倍?/p>

    比较常见的内存泄漏的模型?#8220; 循环引用 模型”?#8220; 闭包函数 模型”?#8220; DOM 插入序模型” , 对于前两U泄漏模型,我们都可以通过在网|构时解除引用的方式来避免。而对?#8220; DOM 插入序模型”则需要通过改变一些惯有的~程习惯的方式来避免?/p>

    有关内存泄漏的模型的更多介绍可以通过 Google 很快的查刎ͼ本文不做q多的阐q。不q,q里我向您推荐一个可用于查找和分析网内存泄露的工?— Drip Q目前的较新版本?0.5 Q下载地址?http://outofhanwell.com/ieleak/index.php

    <!-- [if !supportLists]-->n         <!-- [endif]-->复杂面的分D装载和初始?/p>

    对系l当中某些确实比较复杂而又不便使用 IFrame 的界面,我们可以对其实施分段装蝲。例如对于多|{界面Q我们可以首先下载和初始化多|{默认,然后利用 AJAH Q?asynchronous JavaScript and HTML Q技术来异步的装载其他标{N中的内容。这样就能保证界面可以在W一旉首先展现l用戗把整个复杂界面的装载过E分散到用户的操作过E当中?/p>

    <!-- [if !supportLists]-->n         <!-- [endif]-->利用 GZIP 压羃|络量?/p>

    除了上面提到的这些代码的改良之外,我们q可以利?GZIP 来有效的降低|络量。目前常见的L览器已l全部支?GZIP 法Q我们往往只需要编写少量的代码可以支?GZIP 了。例如在 J2EE 中我们可以在 Filter 中通过下面的代码来判断客户端浏览器是否支持 GZIP 法Q然后根据需要利?java.util.zip.GZIPOutputStream 来实?GZIP 的输出?/p>

            
    1. /* 判断览器对 GZIP 支持方式的代?nbsp;*/   
    2. private static String getGZIPEncoding(HttpServletRequest request) {   
    3.   String acceptEncoding = request.getHeader("Accept-Encoding");   
    4.   if (acceptEncoding == null) return null;   
    5.   acceptEncodingacceptEncoding = acceptEncoding.toLowerCase();   
    6.   if (acceptEncoding.indexOf("x-gzip") >= 0) return "x-gzip";   
    7.   if (acceptEncoding.indexOf("gzip") >= 0) return "gzip";   
    8.   return null;   

    一般而言Q?GZIP 对于 HTML ?JSP 的压~比可以辑ֈ 80% 左右Q而它造成的服务端和客L的性能损耗几乎是可以忽略的。结合其他因素,支持 GZIP 的网站有可能为我们节U?50% 的网l流量。因?GZIP 的用可以ؓ那些|络环境不是特别好的应用带来显著的性能提升。?Http 的监视工?Fiddler 可以方便的检出|页在?GZIP 前后的通讯数据量?Fiddler 的下载地址?http://www.fiddlertool.com/fiddler/

    关于 Web 应用的性能优化其实是一个非常大的话题。本文由于篇q有限,只能涉及其中的几个细节,q且也无法将q些l节的优化方式全面的展现l大家。期望本文能够引起大家对 Web 应用其是客L性能优化的充分重视。毕竟服务端~程技巧已为大家熟知多q_在服务端挖掘性能的潜力已l不大了。而在客户端的Ҏ改进往往能够得到令h惊奇的性能提升?/p>

    【编辑推荐?/p>

    1. JSF和Spring的集?/font>
    2. JSF中用自定义Navigation
    3. 单介lJSF应用
    4. JSF动态生成固定表头和行标的DataTable
    5. JSF和JSP是一Ҏ的搭?/font>


风舞׃ؕ 2011-05-23 18:08 发表评论
]]>
谈如何提高AJAX客户端响应速度【{?/title><link>http://www.aygfsteel.com/nighthun/articles/350864.html</link><dc:creator>风舞׃ؕ</dc:creator><author>风舞׃ؕ</author><pubDate>Mon, 23 May 2011 10:07:00 GMT</pubDate><guid>http://www.aygfsteel.com/nighthun/articles/350864.html</guid><description><![CDATA[<div> <ul>AJAX 的出现极大的改变?Web 应用客户端的操作模式Q它使的用户可以在全心工作时不必频繁的忍受那令h厌恶的页面刷新。理Z AJAX 技术在很大的程度上可以减少用户操作的等待时_同时节约|络上的数据量。而然Q实际情况却q不Lq样。用h怼抱怨用?AJAX 的系l响应速度反而降低了。本文将谈谈如何提高响应速度?/ul> </div> <ul> <p> </p> <p>W者从事AJAX 斚w的研发多q_参与开发了目前国内较ؓ成熟的AJAXq_ -dorado 。根据笔者的l验Q导致这U结果的Ҏ原因q不在AJAX 。很多时候系l响应速度的降低都是由不够合理的界面设计和不够高效的编E习惯造成的。下面我们就来分析几?AJAX 开发过E中需要时L意的环节?/p> <p><!-- [if !supportLists]-->n         <!-- [endif]-->合理的用AJAX客户端编E和q程q程调用?/p> <p>AJAX客户端的~程主要都是Z JavaScript 的。?JavaScript 是一U解释型的编E语aQ它的运行效率相对于 Java {都要稍逊一{V同?JavaScript 又是q行在浏览器q样一个严格受限的环境当中。因此开发h员对于哪些逻辑可以在客L执行应该有一个清醒的认识?/p> <p>在实际的应用中究竟应该怎样使用 客户端编E,q依赖于开发h员的l验判断。这里很多问题是只可意会的。由于篇q有限,在这里我们大致归U_下面q几个注意事:</p> <p><!-- [if !supportLists]-->u       <!-- [endif]-->可能避免频J的使用q程q程调用Q例如避免在循环体中使用q程q程调用?/p> <p><!-- [if !supportLists]-->u       <!-- [endif]-->如果可能的话可能?AJAX 方式的远E过E调用(异步方式的远E过E调用)?/p> <p><!-- [if !supportLists]-->u       <!-- [endif]-->避免重量的数据操作放|在 客户端。例如:大批量的数据复制操作、需要通过大量的数据遍历完成的计算{?/p> <p><!-- [if !supportLists]-->n         <!-- [endif]-->改进?DOM 对象的操作方式?/p> <p>客户端的~程中,?DOM 对象的操作往往是最Ҏ占用 CPU 旉的。而对?DOM 对象的操作,不同的编E方法之间的性能差异又往往是非常大的?/p> <p>以下是三D运行结果完全相同的代码Q它们的作用是在|页中创Z?10x1000 的表根{然而它们的q行速度却有着天壤之别?/p> <pre> <ol> <li>/* 试代码 1 - 耗时 : 41 U?nbsp;*/   </li> <li>var <font color="#ff0000">table</font> = <font color="#0000ff">document</font>.createElement("TABLE");   </li> <li>document.body.appendChild(table);   </li> <li>for(var <font color="#ff0000">i</font> = <font color="#0000ff">0</font>; i <strong><font color="#006699"><</font></strong> <strong><font color="#006699">1000</font></strong>; i++){   </li> <li>  var <font color="#ff0000">row</font> = <font color="#0000ff">table</font>.insertRow(-1);   </li> <li>  for(var <font color="#ff0000">j</font> = <font color="#0000ff">0</font>; j <strong><font color="#006699"><</font></strong> <strong><font color="#006699">10</font></strong>; j++){   </li> <li>    var <font color="#ff0000">cell</font> = <font color="#0000ff">objRow</font>.insertCell(-1);   </li> <li>      <font color="#ff0000">cell.innerText</font> = <font color="#0000ff">"( "</font> + i + " , " + j + " )";   </li> <li>  }   </li> <li>}   </li> <li>/* 试代码 2 - 耗时 : 7.6 U?nbsp;*/   </li> <li>var <font color="#ff0000">table</font> = <font color="#0000ff">document</font>.getElementById("TABLE");   </li> <li>document.body.appendChild(table);   </li> <li>var <font color="#ff0000">tbody</font> = <font color="#0000ff">document</font>.createElement("TBODY");   </li> <li>table.appendChild(tbody);   </li> <li>for(var <font color="#ff0000">i</font> = <font color="#0000ff">0</font>; i <strong><font color="#006699"><</font></strong> <strong><font color="#006699">1000</font></strong>; i++){   </li> <li>  var <font color="#ff0000">row</font> = <font color="#0000ff">document</font>.createElement("TR");   </li> <li>  tbody.appendChild(row);   </li> <li>  for(var <font color="#ff0000">j</font> = <font color="#0000ff">0</font>; j <strong><font color="#006699"><</font></strong> <strong><font color="#006699">10</font></strong>; j++){   </li> <li>    var <font color="#ff0000">cell</font> = <font color="#0000ff">document</font>.createElement("TD");   </li> <li>      row.appendChild(cell);   </li> <li>      <font color="#ff0000">cell.innerText</font> = <font color="#0000ff">"( "</font> + i + " , " + j + " )";   </li> <li>  }   </li> <li>}   </li> <li>/* 试代码 3 - 耗时 : 1.26 U?nbsp;*/   </li> <li>var <font color="#ff0000">tbody</font> = <font color="#0000ff">document</font>.createElement("TBODY");   </li> <li>for(var <font color="#ff0000">i</font> = <font color="#0000ff">0</font>; i <strong><font color="#006699"><</font></strong> <strong><font color="#006699">1000</font></strong>; i++){     </li> <li>  var <font color="#ff0000">row</font> = <font color="#0000ff">document</font>.createElement("TR");   </li> <li>       for(var <font color="#ff0000">j</font> = <font color="#0000ff">0</font>; j <strong><font color="#006699"><</font></strong> <strong><font color="#006699">10</font></strong>; j++){   </li> <li>    var <font color="#ff0000">cell</font> = <font color="#0000ff">document</font>.createElement("TD");   </li> <li>      <font color="#ff0000">cell.innerText</font> = <font color="#0000ff">"( "</font> + i + " , " + j + " )";   </li> <li>      row.appendChild(cell);   </li> <li>  }   </li> <li>  tbody.appendChild(row);   </li> <li>}   </li> <li>var <font color="#ff0000">table</font> = <font color="#0000ff">document</font>.getElementById("TABLE");   </li> <li>table.appendChild(tbody);   </li> <li>document.body.appendChild(table);  </li> </ol> </pre> <p>q里?#8220;试代码 1 ”?#8220;试代码 2 ”之间的差别在于在创徏表格单元时用了不同?API Ҏ。?#8220;试代码 2 ”?#8220;试代码 3 ” 之间的差别在于处理顺序的略微不同?/p> <p>“试代码 1 ”?#8220;试代码 2 ”之间如此大的性能差别我们无从分析Q目前所知的?insertRow ?insertCell ?DHTML 中表格特有的 API Q?createElement ?appendChild ?W3C DOM 的原?API 。而前者应该是对后者的装。不q,我们q不能因此而得出结?DOM 的原?API L优于对象Ҏ?API 。徏议大家在需要频J调用某一 API Ӟ对其性能表现做一些基本的试?/p> <p>“试代码 2 ”?#8220;试代码 3 ”之间的性能差异主要来自于他们的构徏序不同?#8220;试代码 2 ”的做法是首先创徏最外层?<TABLE> 对象Q然后再在@环中依次创徏 <TR> ?<TD> 。?#8220;试代码 3 ”的做法是首先在内存中由内到外的构建好整个表格Q最后再它d到网中。这样做的目的是可能的减少览器重新计页面布局的次数。每当我们将一个对象添加到|页中时Q浏览器都会试寚w面中的控件的布局q行重新计算。所以,如果我们能够首先在内存中整个要构造的对象全部创徏好,然后再一ơ性的d到网中。那么,览器将只会做一ơ布局的重计算 。ȝZ句话那就是越晚执?appendChild 好。有时ؓ了提高运行效率,我们甚至可以考虑先?removeChild 已存在的控件从面中移除,然后构造完成后再重新将其放|回面当中?/p> <p><!-- [if !supportLists]-->n         <!-- [endif]-->提高字符串篏加的速度</p> <p>在?AJAX 提交信息Ӟ我可能常帔R要拼装一些比较大的字W串通过 XmlHttp 来完?POST 提交。尽提交这样大的信息的做法看v来ƈ不优雅,但有时我们可能不得不面对q样的需求。那?JavaScript 中对字符串的累加速度如何呢?我们先来做下面的q个实验。篏加一个长度ؓ 30000 的字W串?/p> <pre> <ol> <li>/* 试代码 1 - 耗时 : 14.325 U?nbsp;*/    </li> <li>var <font color="#ff0000">str</font> = <font color="#0000ff">""</font>;   </li> <li>for (var <font color="#ff0000">i</font> = <font color="#0000ff">0</font>; i <strong><font color="#006699"><</font></strong> <strong><font color="#006699">50000</font></strong>; i++) {   </li> <li>       str += "xxxxxx";   </li> <li>}  </li> </ol> </pre> <p>q段代码耗时 14.325 U,l果q不理想。现在我们将代码改ؓ如下的Ş式:</p> <pre> <ol> <li>/* 试代码 2 - 耗时 : 0.359 U?nbsp;*/    </li> <li>var <font color="#ff0000">str</font> = <font color="#0000ff">""</font>;   </li> <li>for (var <font color="#ff0000">i</font> = <font color="#0000ff">0</font>; i <strong><font color="#006699"><</font></strong> <strong><font color="#006699">100</font></strong>; i++) {   </li> <li>       var <font color="#ff0000">sub</font> = <font color="#0000ff">""</font>;   </li> <li>       for (var <font color="#ff0000">j</font> = <font color="#0000ff">0</font>; j <strong><font color="#006699"><</font></strong> <strong><font color="#006699">500</font></strong>; j++) {   </li> <li>              sub += "xxxxxx";   </li> <li>       }   </li> <li>       str += sub;   </li> <li>}  </li> </ol> </pre> <p>q段代码耗时 0.359 U!同样的结果,我们做的只是首先D一些较的字符串然后再l装成更大的字符丌Ӏ这U做法可以有效的在字W串D的后期减内存复制的数据量。知道了q一原理之后我们q可以把上面的代码进一步拆散以后进行测试。下面的代码仅耗时 0.140 U?/p> <pre> <ol> <li>/* 试代码 3 - 耗时 : 0.140 U?nbsp;*/   </li> <li>var <font color="#ff0000">str</font> = <font color="#0000ff">""</font>;    </li> <li>for (var <font color="#ff0000">i1</font> = <font color="#0000ff">0</font>; i1 <strong><font color="#006699"><</font></strong> <strong><font color="#006699">5</font></strong>; i1++) {   </li> <li>       var <font color="#ff0000">str1</font> = <font color="#0000ff">""</font>;   </li> <li>       for (var <font color="#ff0000">i2</font> = <font color="#0000ff">0</font>; i2 <strong><font color="#006699"><</font></strong> <strong><font color="#006699">10</font></strong>; i2++) {   </li> <li>              var <font color="#ff0000">str2</font> = <font color="#0000ff">""</font>;   </li> <li>              for (var <font color="#ff0000">i3</font> = <font color="#0000ff">0</font>; i3 <strong><font color="#006699"><</font></strong> <strong><font color="#006699">10</font></strong>; i3++) {   </li> <li>                     var <font color="#ff0000">str3</font> = <font color="#0000ff">""</font>;   </li> <li>                     for (var <font color="#ff0000">i4</font> = <font color="#0000ff">0</font>; i4 <strong><font color="#006699"><</font></strong> <strong><font color="#006699">10</font></strong>; i4++) {   </li> <li>                            var <font color="#ff0000">str4</font> = <font color="#0000ff">""</font>;   </li> <li>                            for (var <font color="#ff0000">i5</font> = <font color="#0000ff">0</font>; i5 <strong><font color="#006699"><</font></strong> <strong><font color="#006699">10</font></strong>; i5++) {   </li> <li>                                   str4 += "xxxxxx";   </li> <li>                            }   </li> <li>                            str3 += str4;   </li> <li>                     }   </li> <li>                     str2 += str3;   </li> <li>              }   </li> <li>              str1 += str2;   </li> <li>       }   </li> <li>       str += str1;     </li> <li>}  </li> </ol> </pre> <p>不过Q上面这U做法也许ƈ不是最好的Q如果我们需要提交的信息?XML 格式的(其实l大多数情况下,我们都可以设法将要提交的信息l装?XML 格式Q,我们q能扑ֈ更高效更优雅的方?— 利用 DOM 对象为我们组装字W串。下面这D代买组装一个长度ؓ 950015 的字W串仅须耗时 0.890 U?/p> <pre> <ol> <li>/* 利用 DOM 对象l装信息 - 耗时 : 0.890 U?nbsp;*/   </li> <li>var xmlDoc;     </li> <li>if (<font color="#ff0000">browserType</font> == BROWSER_IE) {   </li> <li>       <font color="#ff0000">xmlDoc</font> = <font color="#0000ff">new</font> ActiveXObject("Msxml.DOMDocument");   </li> <li>}   </li> <li>else {   </li> <li>       <font color="#ff0000">xmlDoc</font> = <font color="#0000ff">document</font>.createElement("DOM");   </li> <li>}   </li> <li>var <font color="#ff0000">root</font> = <font color="#0000ff">xmlDoc</font>.createElement("root");   </li> <li>for (var <font color="#ff0000">i</font> = <font color="#0000ff">0</font>; i <strong><font color="#006699"><</font></strong> <strong><font color="#006699">50000</font></strong>; i++) {   </li> <li>       var <font color="#ff0000">node</font> = <font color="#0000ff">xmlDoc</font>.createElement("data");   </li> <li>       if (<font color="#ff0000">browserType</font> == BROWSER_IE) {   </li> <li>              <font color="#ff0000">node.text</font> = <font color="#0000ff">"xxxxxx"</font>;   </li> <li>       }   </li> <li>       else {   </li> <li>              <font color="#ff0000">node.innerText</font> = <font color="#0000ff">"xxxxxx"</font>;   </li> <li>       }   </li> <li>       root.appendChild(node);   </li> <li>}   </li> <li>xmlDoc.appendChild(root);   </li> <li>var str;   </li> <li>if (<font color="#ff0000">browserType</font> == BROWSER_IE) {   </li> <li>       <font color="#ff0000">str</font> = <font color="#0000ff">xmlDoc</font>.xml;   </li> <li>}   </li> <li>else {   </li> <li>       <font color="#ff0000">str</font> = <font color="#0000ff">xmlDoc</font>.innerHTML;   </li> <li>}   </li> <li><font color="#008200"><!-- [if !supportLists]--></font>n   </li> </ol> </pre> <p><!-- [endif]-->避免 DOM 对象的内存泄漏?/p> <p>关于 IE ?DOM 对象的内存泄露是一个常常被开发h员忽略的问题。然而它带来的后果却是非怸重的Q它会导?IE 的内存占用量持箋上升Qƈ且浏览器的整体运行速度明显下降。对于一些泄露比较严重的|页Q甚臛_要刷新几ơ,q行速度׃降低一倍?/p> <p>比较常见的内存泄漏的模型?#8220; 循环引用 模型”?#8220; 闭包函数 模型”?#8220; DOM 插入序模型” , 对于前两U泄漏模型,我们都可以通过在网|构时解除引用的方式来避免。而对?#8220; DOM 插入序模型”则需要通过改变一些惯有的~程习惯的方式来避免?/p> <p>有关内存泄漏的模型的更多介绍可以通过 Google 很快的查刎ͼ本文不做q多的阐q。不q,q里我向您推荐一个可用于查找和分析网内存泄露的工?— Drip Q目前的较新版本?0.5 Q下载地址?http://outofhanwell.com/ieleak/index.php</p> <p><!-- [if !supportLists]-->n         <!-- [endif]-->复杂面的分D装载和初始?/p> <p>对系l当中某些确实比较复杂而又不便使用 IFrame 的界面,我们可以对其实施分段装蝲。例如对于多|{界面Q我们可以首先下载和初始化多|{默认,然后利用 AJAH Q?asynchronous JavaScript and HTML Q技术来异步的装载其他标{N中的内容。这样就能保证界面可以在W一旉首先展现l用戗把整个复杂界面的装载过E分散到用户的操作过E当中?/p> <p><!-- [if !supportLists]-->n         <!-- [endif]-->利用 GZIP 压羃|络量?/p> <p>除了上面提到的这些代码的改良之外,我们q可以利?GZIP 来有效的降低|络量。目前常见的L览器已l全部支?GZIP 法Q我们往往只需要编写少量的代码可以支?GZIP 了。例如在 J2EE 中我们可以在 Filter 中通过下面的代码来判断客户端浏览器是否支持 GZIP 法Q然后根据需要利?java.util.zip.GZIPOutputStream 来实?GZIP 的输出?/p> <pre> <ol> <li>/* 判断览器对 GZIP 支持方式的代?nbsp;*/   </li> <li>private static String getGZIPEncoding(HttpServletRequest request) {   </li> <li>  String <font color="#ff0000">acceptEncoding</font> = <font color="#0000ff">request</font>.getHeader("Accept-Encoding");   </li> <li>  if (<font color="#ff0000">acceptEncoding</font> == null) return null;   </li> <li>  <font color="#ff0000">acceptEncoding</font><font color="#0000ff">acceptEncoding</font> = acceptEncoding.toLowerCase();   </li> <li>  if (acceptEncoding.indexOf("x-gzip") <strong><font color="#006699">></font></strong>= 0) return "x-gzip";   </li> <li>  if (acceptEncoding.indexOf("gzip") <strong><font color="#006699">></font></strong>= 0) return "gzip";   </li> <li>  return null;   </li> <li>} </li> </ol> </pre> <p>一般而言Q?GZIP 对于 HTML ?JSP 的压~比可以辑ֈ 80% 左右Q而它造成的服务端和客L的性能损耗几乎是可以忽略的。结合其他因素,支持 GZIP 的网站有可能为我们节U?50% 的网l流量。因?GZIP 的用可以ؓ那些|络环境不是特别好的应用带来显著的性能提升。?Http 的监视工?Fiddler 可以方便的检出|页在?GZIP 前后的通讯数据量?Fiddler 的下载地址?http://www.fiddlertool.com/fiddler/</p> <p>关于 Web 应用的性能优化其实是一个非常大的话题。本文由于篇q有限,只能涉及其中的几个细节,q且也无法将q些l节的优化方式全面的展现l大家。期望本文能够引起大家对 Web 应用其是客L性能优化的充分重视。毕竟服务端~程技巧已为大家熟知多q_在服务端挖掘性能的潜力已l不大了。而在客户端的Ҏ改进往往能够得到令h惊奇的性能提升?/p> </ul> <div> <ul></ul> </div> <ul> <p> </p> </ul><img src ="http://www.aygfsteel.com/nighthun/aggbug/350864.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/nighthun/" target="_blank">风舞׃ؕ</a> 2011-05-23 18:07 <a href="http://www.aygfsteel.com/nighthun/articles/350864.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转脓] 谈不hq80后,看来我们真的是老了吗?http://www.aygfsteel.com/nighthun/archive/2009/10/25/299693.html风舞׃ؕ风舞׃ؕSun, 25 Oct 2009 13:52:00 GMThttp://www.aygfsteel.com/nighthun/archive/2009/10/25/299693.html[
现在的我们已l到了谈婚论嫁的q龄Q?br /> 但是w边好多同学和同事仍然是单n?br /> 当我问及他们的时候,回答都是Q婚L件大事不敢太草率了,
所以选自己另一半的时候更多的是理智?br /> 然而,好多没谈q恋q是期望自p谈一场真正的恋爱Q?br /> 然后和自己心q人携手走入婚ȝD堂?br /> 但是谈恋爱对80q代的我们来说已l成ZU奢侈,
有这U想法的人恐怕不只是我一个hQ因为我们都谈不h׃?br /> 不管谈过q是没谈q,都不敢把太多的感情放在恋׃Q?br /> 因ؓx失败,我们已经承受不v?

[::艾泽拉斯国家地理 BBS.NGACN.CC::]

有同事去怺Q有时不错,回来后就l常联系。但是她说找不到恋爱的感觉,更像是朋友,
他们不会付出太多的感情,也不会对你太好?br /> 是啊Q可以理解,
因ؓ男h们也x,他们同样不敢d试,
x自己是剃头挑子一头热?br /> 姐妹们谈起婚ȝ时候L在说Q找个对自己好的男h嫁了吧Q?br /> 不管自己喜不喜欢Q结婚后也会对他好,
生个Babyt踏实实q一辈子?br /> h朋友则是找个会q日子的女hQ?br /> 好好待她Q安安稳E日子好了,
因ؓ在外面打拼真的很累,x个温暖家?br /> 才发现恋爱已l离我们q去Q?br /> 剩下的只是婚姅R生zR日子?

x我们的这?0后的ZQ爱情远L们,l婚又像是完成命一P
l济条g也不是那么重要,
找个男h(女h)t踏实实q日子才是我们的宗旨?br /> 当妹妹告诉我她们宿舍的女孩如何如何谈恋爱Q?br /> 如何如何换男朋友Q如何如何浪漫,
我只能感?#8220;你们q有谈恋q资本和勇气?#8221;
妹妹说你也不老啊Q别L自己想的那么老,赶快l我找个姐夫?br /> 我们q不是承认自p,臛_我这栯为,但是爱情观和婚姻观还是大不一L?

当有朋友问v我什么时候结婚?我说q男朋友q没有和谁结婚啊Q?#8220;那找一个嘛Q?#8221;
“又不是逛商场,说找个就找个Q?#8221;“哎呀Q要求不要那么高啊!”
其实我也和姐妹们一Lx找个仅仅Ҏ好的好了,
相貌、学历、经都不重要,重要的是个h能力?br /> “三高政策”也只是我们茶余饭后开的玩W话|了?br /> 姐妹们经常说Q当真正有一个疼我们、爱我们的h摆在面前的时候,
我们一定好好珍惜?br /> 是现在的好男人少了吗Q?br /> 不是Q我不这栯为,好男是很多的Q?br /> 只是我们没有发觉又或者是发觉了没有勇气去说服自己?br /> 好多奛_都是放不下自q持,总认为男孩应该主动?br /> 因ؓ我们不像90q代的h们敢爱敢恨,
可以大胆说出自己的爱Q哪怕是被拒l?br /> 臛_我n边的好多朋友都是q样Q错q了好多好男人,
当自己心q男h成ؓ别h的老公的时候,
而且是通过别h介绍l婚的时候,
我们只能偷偷的抹一把泪Qؓ他们福?br /> 又或者关几天自己闭Q故事的l局往往是那么伤感?br /> Z么我们宁愿彼此都受伤Q也不愿意把心中的爱说出来呢Q?br /> 因ؓ我们L不确定对方心里是否有我们?br /> 所以我们L在矛盾中把自q恋爱丢掉了,
不知不觉来Cl婚的年龄?br />
可是此时我们真的已经谈不h׃Q?

喜欢隐n了,
不怎么爱在里发言?
不论和多h在一块,手机L着QQQ?br /> 一堆h聚在一块,一Z台手机,各玩各的?br /> 同学聚会必修的两个项目:吃饭QKTV
孩都开始叫自己叔叔或者阿姨了Q?br /> 虽然l常不大情愿地反驳着Q叫姐姐Q叫哥哥
永远寂寞Q不你是一人独处时Q还是n在h当中,
像那首歌中q一P孤单Q是一个h的狂Ƣ,狂欢Q是一h的孤单?br /> 没那么愤青了Q遇C公的时候,会告诉自己,C会是q样Q?br /> 可以不看电视Q但电脑是必需品,
出门y达必带三g宝:手机Q钥匙,?br /> 永远不知道钱花哪了,没怎么吃,没怎么I?br /> 消极Q拒l长大?br /> 不喜Ƣ被成熟Q?br /> 熟h面前是话唠,生h面前一a不发Q?br /> 爱好中必定有一Ҏ睡觉Q?br /> 成天泡在|上Q又不知道做什么好?br /> 最常说的一句话?#8220;无聊”,
管Q他们在|络上,花去了大把时间?br /> 减肥是永恒不变的话题和行动,
饿了吃Q经常早饭午饭ƈ在一起吃Q?br /> 打字的手法相当不准确Q但q是打的很快?br /> 凌晨12点前很少会入睡,
什么都可以“随便”Q因为没那么多时_也不在意那么多的事情?br /> 毫无理由没有资本的高Ԍ骨子里却自卑Q期待肯定,期待认可Q被讨厌做hp|的时候连说话的勇气都没有?br /> 觉得别h不可能了解自己,q以此作为对别h不屑的理由?br /> 因ؓ别h都恋׃Q所以自己就恋爱了,更多的是l爱而不是恋爱,然后q自己都开始怀疑曾l对爱情?坚持?br /> 曄以ؓ一辈子陪在w边的朋友,某天某月Q就H然发现他们都不见了?br /> 午夜醒来Q才愕然发现Q从来都是只有自׃个hQ?br /> 成长Q越Ҏ孤单?br />
80后的我们Q有很多的梦惻I有的实现了有的破灭了?br /> 80后的我们Q有的出名,有的默默无闻?br /> 80后的我们Q挣扎过 彷Lq,q是来了?br /> 80后的我们Q退去青春年q的智嫩Q开始适应C会大家庭?br /> 我们的心里都很清楚,我们l历了太多太多?br /> 亲情的分与合Q?br /> 爱情的分与合Q?br /> 友情的分与合Q?br /> 曾不一切的q求q的Q后来变的一文不值得?br /> 父母曄般阻挠的事,直到自己受伤Q才明白Q父母原来是对的?br /> 曾无数次的问q自己,Z 么活着Q?br /> 到后来,已经懒得的去x着的意义?br /> 曾ؓ了爱情可以不好好的读书,
到后来ؓ了工作可以丢下爱情?br /> 现在是否q记得最初的梦想Q?br /> 或者说Q?q有多少人,一直坚持着自己q少时的梦想?br /> 在家里,父母Ҏ们百依百,
Z安Q我们对C会百依N?br /> 看不惯的事情也就渐渐习惯了,不知道这U习惯是好是坏?
我甚至不知道我现在的梦想应该是什么?
但有一点的是肯定的Q?br /> 不会再做一些年轻狂的梦了......


风舞׃ؕ 2009-10-25 21:52 发表评论
]]>
java 拼接文字和图?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/nighthun/archive/2009/10/14/298154.html</guid><description><![CDATA[<p>public static void test2() {<br />   try {<br />    // dW一张图?br />    // File fileOne = new File("D:\\qq.jpg");<br />    // BufferedImage ImageOne = ImageIO.read(fileOne);<br />    // int width = ImageOne.getWidth();//囄宽度<br />    // int height = ImageOne.getHeight();//囄高度</p> <p>   // 对第二张囄做相同的处理<br />    File fileTwo = new File("D:\\qq.jpg");<br />    BufferedImage ImageTwo = ImageIO.read(fileTwo);</p> <p>   int width = ImageTwo.getWidth();// 囄宽度<br />    int height = ImageTwo.getHeight();// 囄高度<br />    int height2 = 20;</p> <p>   BufferedImage ImageOne = new BufferedImage(width, height2,<br />      BufferedImage.TYPE_4BYTE_ABGR);<br />    // ImageOne.get</p> <p>   Graphics g = ImageOne.getGraphics();//   <br />    g.fillRect(0, 0, width, height);<br />    g.setColor(Color.blue);<br />    Font mFont = new Font("宋体", Font.PLAIN, 12);<br />    g.setFont(mFont);<br />    String text = "d文字试";<br />    g.drawString(text, 0, 10);<br />    // 从图片中dRGB<br />    int[] ImageArrayOne = new int[width * height2];<br />    ImageArrayOne = ImageOne.getRGB(0, 0, width, height2,<br />      ImageArrayOne, 0, width);</p> <p>   int[] ImageArrayTwo = new int[width * height];<br />    ImageArrayTwo = ImageTwo.getRGB(0, 0, width, height, ImageArrayTwo,<br />      0, width);</p> <p>   // 生成新图?br />    BufferedImage ImageNew = new BufferedImage(width, height + height2,<br />      BufferedImage.TYPE_INT_RGB);<br />    ImageNew.setRGB(0, 0, width, height2, ImageArrayOne, 0, width);// 讄上半部分的RGB<br />    // ImageNew.setRGB(width,0,width,height,ImageArrayTwo,0,width);//讄叛_部分的RGB<br />    ImageNew.setRGB(0, height2, width, height, ImageArrayTwo, 0, width);// 讄下半部分的RGB</p> <p>   File outFile = new File("d:\\qq2.jpg");<br />    ImageIO.write(ImageNew, "jpg", outFile);// 写图?br />   } catch (Exception e) {<br />    e.printStackTrace();<br />   }<br />  }</p> <img src ="http://www.aygfsteel.com/nighthun/aggbug/298154.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/nighthun/" target="_blank">风舞׃ؕ</a> 2009-10-14 10:11 <a href="http://www.aygfsteel.com/nighthun/archive/2009/10/14/298154.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JS获取屏幕Q浏览器Q网高度宽度[转]http://www.aygfsteel.com/nighthun/archive/2009/06/26/284318.html风舞׃ؕ风舞׃ؕFri, 26 Jun 2009 09:31:00 GMThttp://www.aygfsteel.com/nighthun/archive/2009/06/26/284318.html
|页可见区域宽:document.body.clientWidth
|页可见区域高:document.body.clientHeight
|页可见区域宽:document.body.offsetWidth (包括边线的宽)
|页可见区域高:document.body.offsetHeight (包括边线的宽)
|页正文全文宽:document.body.scrollWidth
|页正文全文高:document.body.scrollHeight
|页被卷ȝ高:document.body.scrollTop
|页被卷ȝ左:document.body.scrollLeft
|页正文部分上:window.screenTop
|页正文部分左:window.screenLeft
屏幕分L率的高:window.screen.height
屏幕分L率的宽:window.screen.width
屏幕可用工作区高度:window.screen.availHeight
屏幕可用工作区宽度:window.screen.availWidth


HTML_定位:scrollLeft,scrollWidth,clientWidth,offsetWidth
scrollHeight: 获取对象的滚动高度?
scrollLeft:讄或获取位于对象左边界和窗口中目前可见内容的最左端之间的距?
scrollTop:讄或获取位于对象最端和窗口中可见内容的最端之间的距?
scrollWidth:获取对象的滚动宽?
offsetHeight:获取对象相对于版面或q坐标 offsetParent 属性指定的父坐标的高度
offsetLeft:获取对象相对于版面或?offsetParent 属性指定的父坐标的计算左侧位置
offsetTop:获取对象相对于版面或?offsetTop 属性指定的父坐标的计算端位置
event.clientX 相对文档的水q_?
event.clientY 相对文档的垂直?
event.offsetX 相对容器的水q_?
event.offsetY 相对容器的垂直坐?
document.documentElement.scrollTop 垂直方向滚动的?
event.clientX+document.documentElement.scrollTop 相对文档的水q_?垂直方向滚动的量

IEQFireFox 差异如下Q?

IE6.0、FF1.06+Q?

clientWidth = width + padding

clientHeight = height + padding

offsetWidth = width + padding + border

offsetHeight = height + padding + border

IE5.0/5.5Q?
clientWidth = width - border

clientHeight = height - border

offsetWidth = width

offsetHeight = height

(需要提一下:CSS中的margin属性,与clientWidth、offsetWidth、clientHeight、offsetHeight均无?


风舞׃ؕ 2009-06-26 17:31 发表评论
]]>
վ֩ģ壺 ɽ| | Ǩ| | | ְ| ٲ| ʯׯ| | | | | | ²| | ˳| ϳ| | | | ɽ| Ԫ| Ļ| | | | | | | ΢ɽ| | ٲ| ʯׯ| | | | | ̨| żҿ| ƽ| Ͼ|