﻿<?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-&lt;h3 style="font-family: Comic Sans MS"&gt;&lt;font color="#FA1A0A" size="10"&gt;︻┳═一Java&lt;/font&gt;&lt;/h3&gt;-随笔分类-RIA</title><link>http://www.blogjava.net/rain1102/category/37655.html</link><description>&lt;br/&gt;&lt;font color="green" style="font-family: 华文行楷;font-size:16px;"&gt;子曰：危邦不入，乱邦不居。天下有道则见，无道则隐。&lt;/font&gt;&lt;font color="#3C1435"&gt;&lt;/font&gt;</description><language>zh-cn</language><lastBuildDate>Fri, 20 Feb 2009 18:29:05 GMT</lastBuildDate><pubDate>Fri, 20 Feb 2009 18:29:05 GMT</pubDate><ttl>60</ttl><item><title>开发高效的 OpenLaszlo 应用(转)</title><link>http://www.blogjava.net/rain1102/archive/2007/01/30/96804.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Tue, 30 Jan 2007 15:02:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2007/01/30/96804.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/96804.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2007/01/30/96804.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/96804.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/96804.html</trackback:ping><description><![CDATA[<blockquote>本文对如何开发高效的OpenLaszlo应用展开了深入的讨论。结合官方的开发指南，笔者对如何获得满意的性能给出了自己的最佳实践。这些建议主要涵盖了延缓初始化时间、惰性复制数据、缓存数据等三方面内容。</blockquote>
		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
		<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
		<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
		<p>作为当今主流的Rich Internet Application应用平台，OpenLaszlo为用户界面开发人员提供了强大的API来创建基于Flash的富客户端程序。虽然OpenLaszlo拥有简洁、快速的开发方式，但是我们仍然需要投入大量精力来关注数据驱动的OpenLaszlo应用的性能。本文对如何开发高效的OpenLaszlo应用展开了深入的讨论。结合官方的开发指南，笔者对如何获得满意的性能给出了自己的最佳实践。这些建议主要涵盖了延缓初始化时间、惰性复制数据、缓存数据等三方面内容，并以具体的试验数据来说明它们的有效性。</p>
		<p>
				<a name="N10040">
						<span class="atitle">1. OpenLaszlo简介</span>
				</a>
		</p>
		<p>在Web应用越来越关注用户体验的今天，传统的HTML应用已经不能满足开发人员和终端用户的需求。OpenLaszlo作为当今主流的RIA（Rich Internet Application）的应用平台，在进入开源社区之后显示出了更大的活力。Laszlo的技术基于XML和JavaScript来构建RIA程序，为Web开发人员提供了一种简洁快速的编程模式，并且给终端用户以更加动态的交互式体验。</p>
		<p>OpenLaszlo的SDK（Standard Development Kit）由一个用Java编写的编译器、一个运行时的JavaScript库和一个可选的Java Servlet构成，如图1.1所示。开发OpenLaszlo的步骤非常简单：编辑、保存和刷新源文件即可。开发人员可以使用任何文本编辑器来编辑源文件，并且将其对应的URL键入浏览器。OpenLaszlo服务器自动地将文件编译成一个Flash文件，然后浏览器将其展示出来。</p>
		<br />
		<a name="N1004E">
				<b>图1.1 Laszlo服务器的总体架构</b>
		</a>
		<br />
		<img height="302" alt="图1.1 Laszlo服务器的总体架构" src="http://www-128.ibm.com/developerworks/cn/xml/x-cn-laszloperf/images/image002.gif" width="309" border="0" />
		<br />
		<p>OpenLaszlo应用由LZX的文件组成。LZX是一种标准驱动的XML和JavaScript描述性的语言，它使得上述声明式的（declarative）、基于文本的开发流程变为可能。列表1.2展示了一段简单的OpenLaszlo程序代码，它定义了一个按钮，用户在按下之后该按钮的位置会向右移动一段固定的距离。</p>
		<br />
		<a name="N10061">
				<b>列表1.2 一个简单的OpenLaszlo应用</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">&lt;canvas height="30"&gt;
  &lt;button onclick="animate('x', 100, 1000, true)"&gt;
    Move me
  &lt;/button&gt;
&lt;/canvas&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>在下一章，我们将根据OpenLaszlo官方的开发指南，构建一个数据驱动的应用程序，并对其进行深入的分析和调试。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/xml/x-cn-laszloperf/?S_TACT=105AGX52&amp;S_CMP=techcsdn#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N1006E">
						<span class="atitle">2. 开发数据驱动的应用程序</span>
				</a>
		</p>
		<p>
				<a name="N10074">
						<span class="smalltitle">
								<strong>
										<font face="Arial">2.1 一个典型的应用场景</font>
								</strong>
						</span>
				</a>
		</p>
		<p>为了更加清楚地说明我们的主题，我们根据OpenLaszlo的官方软件开发指南[1]，扩展了其中通讯录的示例。这个应用提供了一个功能齐全的联系人列表，它列出了所有的联系人，并允许用户对联系人添加、删除和更新。唯一不同的是，我们的程序为用户提供了更多的选项，包含了更多的数据。图2.1展示了该程序的界面。</p>
		<br />
		<a name="N1007F">
				<b>图2.1 一个通讯录的应用</b>
		</a>
		<br />
		<img height="398" alt="图2.1 一个通讯录的应用" src="http://www-128.ibm.com/developerworks/cn/xml/x-cn-laszloperf/images/image004.jpg" width="553" border="0" />
		<br />
		<p>由于联系人的功能和教程上的基本相同，我们使用了和OpenLaszlo指南中相同的方法来实现它。列表2.2描述了应用中一个类contactview的部分代码。</p>
		<br />
		<a name="N10092">
				<b>列表2.2 联系人视图（contactview）的源代码</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">&lt;class name="contactview" extends="view" visible="false" x="20"
height="180"&gt;
    &lt;simplelayout axis="y" spacing="5" /&gt;
    &lt;view layout="axis:x; spacing: 10"&gt;
        &lt;text y="10"&gt;First Name:&lt;/text&gt;
        &lt;edittext name="firstName" datapath="firstName/text()" y="10"/&gt;
        &lt;text y="10"&gt;Last Name:&lt;/text&gt;
        &lt;edittext name="lastname" datapath="lastName/text()" y="10"/&gt; 
		
    &lt;/view&gt;
    &lt;view&gt;
        &lt;text x="0" y="10"&gt;Gender:&lt;/text&gt;
        &lt;radiogroup layout="axis: x" x="80" y="12" datapath="gender" &gt;    
           &lt;attribute name="genderv" type="string" value="$path{'text()'}"
		   /&gt;
           &lt;method event="ondata"&gt;
              this.selectItem(this.getAttribute('genderv'));
           &lt;/method&gt;            
           &lt;radiobutton value="'M'" text="Male" /&gt;
           &lt;radiobutton value="'F'" text="Female"/&gt;
        &lt;/radiogroup&gt;
        &lt;text x="195" y="10"&gt;Country:&lt;/text&gt;
        &lt;mycombobox x="275" y="10" width="105" 
            datapath="country/text()"&gt;
            &lt;textlistitem value="${this.text}" 
                datapath="timedata:/time/day/item/text()"/&gt;
        &lt;/mycombobox&gt;
    &lt;/view&gt;
&lt;/class&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>此外，虽然应用的数据存储在本地机器的XML文件中，但如列表2.3所示，我们对数据集的type和request属性做了设置，使应用程序在运行时才能够得到数据。在这种情况下，我们能够模拟OpenLaszlo的客户端从远程的服务器中获得数据的情景。</p>
		<br />
		<a name="N1009F">
				<b>列表2.3 数据集的设置</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">&lt;dataset name="countrydata" request="true" type="http" src="countries.xml"/&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
				<a name="N100A9">
						<span class="smalltitle">
								<strong>
										<font face="Arial">2.2 系统瓶颈</font>
								</strong>
						</span>
				</a>
		</p>
		<p>完成上述应用之后，性能问题迅速地显现出来。系统主要在以下三方面表现出了性能的瓶颈：</p>
		<p>1. 程序初始化的时间很长。当列表达到30个联系人条目的规模时，程序就会花费很长时间来显示整个列表。在程序装载的过程中，这些条目逐条缓慢地显示出来。而在此期间，用户几乎不可能进行任何操作。</p>
		<p>2. 下拉框（combobox）的初始化时间长度令人难以接受。当下拉框的选项非常多时，由于控件会等待列表初始化完毕后才变为可见，这将会耗费大量的时间和内存。</p>
		<p>3. 删除功能的表现也不尽如人意，尤其在用户尝试删除位于顶端的条目。当一个条目被删除时，在其之下的条目将会被完全地刷新。这样的重画界面也引发了严重的性能问题。鉴于以上的性能问题，我们将逐步讨论如何解决这些问题。在第三章中，我们会阐述一些能够提高性能的普遍原则，并应用到本章所演示的程序里。进一步的，第四章将描述本文所涉及的实验方法，并且向读者展现比较实验的结果。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/xml/x-cn-laszloperf/?S_TACT=105AGX52&amp;S_CMP=techcsdn#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
				<a name="N100BB">
						<span class="atitle">3. 优化OpenLaszlo程序的原则</span>
				</a>
		</p>
		<p>
				<a name="N100C1">
						<span class="smalltitle">
								<strong>
										<font face="Arial">3.1 延缓初始化时间</font>
								</strong>
						</span>
				</a>
		</p>
		<p>在默认情况下，OpenLaszlo会在加载页面时对所有的元素全部进行初始化。无论这些元素是可见或不可见的，它们都会被实例化。同时，OpenLaszlo提供了initstage属性来控制何时执行节点的init方法以及发送oninit事件的时机。initstage是LzNode的属性，换言之，它几乎可以被所有的元素继承并使用，它有五种可选的属性值[2]：</p>
		<ul>
				<li>immediate<br />除非该实例的所有子节点被创建，否则其他代码都不得运行。也就是说，初始化是实例化的最后一个阶段。 
</li>
				<li>early<br />在视图（view）和它的子节点被创建后，立即调用init方法。 
</li>
				<li>normal<br />系统缺省值。Init方法在初始化父节点的工作完成后被调用。 
</li>
				<li>late<br />在系统空闲时（idle）初始化节点。用户可以通过检查isinited属性来确认节点是否被初始化完毕。如果想在某一时刻强制节点初始化，可以调用completeInstantiation方法。 
</li>
				<li>defer<br />在该设置下，除非用户显式地调用completeInstantiation，否则节点将不会被初始化。 </li>
		</ul>
		<p>不难看出，使用late和defer的节点，在执行init方法以及发送oninit事件时，并不一定被初始化完毕。因此，它们非常适用于延缓OpenLaszlo节点的初始化时间。对一些在页面初次加载时不可见的节点，我们可以使用initstage = defer来抑制初始化，在触发其可见的事件上按需调用completeInstantiation。这样既可以减少页面初始化的时间，又可以减少很多不必要的初始化。因为对用户而言，很多不可见的元素是不需要被加载进系统的。</p>
		<p>具体到我们的通讯录应用中，显示联系人细节的视图（contactview）完全符合上述的条件。于是，我们将其initstage的属性设为defer，并且重写了其父节点的onclick事件，使得只有在用户点击了条目后，细节视图才会占用系统的资源，按需地被初始化。列表3.1描述了具体的代码。</p>
		<br />
		<a name="N100EC">
				<b>列表3.1延缓初始化时间的代码</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">&lt;view id="newEntryView"&gt;
    &lt;text text="New Entry..." &gt; 
        &lt;method event="onclick"&gt;
                parent.newContactView.setVisible(!parent.newContactView.visible);
                //在点击时完成初始化
                parent.newContactView.completeInstantiation(); 
        &lt;/method&gt;
&lt;/text&gt;
&lt;contactview name="newContactView" 
     datapath="newcontact:/contact"
     initstage="defer"&gt; &lt;!--在页面初次加载时不初始化contactview--&gt;
     &lt;button width="80" x="300" text="Add" /&gt;
&lt;/contactview&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
				<a name="N100F6">
						<span class="smalltitle">
								<strong>
										<font face="Arial">3.2 惰性复制数据</font>
								</strong>
						</span>
				</a>
		</p>
		<p>用户界面中，经常存在实际条目比展示给用户的条目多的列表。OpenLaszlo为这种情况在baselist、basecombobox等节点中定义了dataoption属性。当dataoption取lazy值时，列表的条目（listitem）将会使用惰性复制，即只复制需要显示的条目。通讯录中表示国家的下拉框有近200个选项，就属于这种情况。在列表3.2中，我们自定义了一个下拉框类，并附上了它的使用示例。这样，即使有200个数据项，系统也只复制了5个textlistitem的视图。</p>
		<br />
		<a name="N100FF">
				<b>列表3.2 使用惰性复制的下拉框</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">&lt;class name="mycombobox" extends="combobox" editable="false"
      shownitems="5" 
      dataoption="lazy" /&gt;
&lt;mycombobox id="country" x="275"
      width="105" 
      datapath="country/text()"&gt;
&lt;textlistitem datapath="countrydata:/countries/country/text()" 
          value="${this.text}" /&gt;
&lt;/mycombobox&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>值得一提的是，我们在&lt;textlistitem&gt;中直接定义了datapath属性，因此它继承了父节点dataopiton = lazy的特征。如果在&lt;textlistitem&gt;下单独定义datapath元素，那么我们还必须将其replication属性设为lazy，如表3.3所示。</p>
		<br />
		<a name="N1010C">
				<b>列表3.3 单独声明datapath的textlistitem</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">&lt;mycombobox &gt;
&lt;textlistitem value="${this.text}" &gt;
    &lt;datapath xpath="countrydata:/countries/country/text()" 
         replication = "lazy" /&gt;
&lt;/textlistitem&gt;
&lt;/mycombobox&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>事实上，OpenLaszlo使用惰性复制的列表使用LzLazyReplicationManager而不是缺省的LzReplicationManager来控制视图。后者在视图的datapath和多个datanode匹配时，为每一个匹配都创建一个视图；而前者出于显示数据的考虑，只创建足够数量的视图。本文的例子中，通讯录的条目过多时（如超过100条），也可以考虑使用lazy的属性使初始化时间变快。</p>
		<p>
				<a name="N10119">
						<span class="smalltitle">
								<strong>
										<font face="Arial">3.3 缓存数据</font>
								</strong>
						</span>
				</a>
		</p>
		<p>假使OpenLaszlo应用使用了数据复制，而且这些数据在运行时改变的话，默认的LzReplicationManager会将数据改变所对应的视图销毁，然后重新创建它们。显而易见，如果数据集非常大，这样的调整策略会导致用户界面严重的反应迟缓。如第二章所述，我们的通讯录应用在删除位于列表顶端的记录时，就会出现明显的延迟。</p>
		<p>为了解决上述问题，我们可以将匹配多个数据节点的datapath中的pooling属性设为true。设置之后，LzLazyReplicationManager只是将改变了的数据重新指向已经被创建的视图。这样用户界面所反映出的数据更新速度会明显加快，具体的应用见列表3.4。</p>
		<br />
		<a name="N10125">
				<b>列表3.4 使用pooling属性</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">&lt;view&gt;
    &lt;datapath xpath="dset:/phonebook/contact" pooling="true" /&gt;
    &lt;simplelayout axis="y" /&gt;
    &lt;view name="list" &gt;
      &lt;!-- more... --&gt;
    &lt;/view&gt;
&lt;/view&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N1012F">
						<span class="atitle">4. 性能比较和分析</span>
				</a>
		</p>
		<p>
				<a name="N10135">
						<span class="smalltitle">
								<strong>
										<font face="Arial">4.1 测试方法和模型</font>
								</strong>
						</span>
				</a>
		</p>
		<p>最后，我们将对本文提及的实验进行性能的监测和调试。根据上文的原则，我们采用OpenLaszlo 3.3.3，对性能优化前后的结果进行比较。表4.1展示了实验的具体配置。</p>
		<br />
		<b>表4.1 实验环境的配置</b>
		<br />
		<table width="443" border="1">
				<tbody>
						<tr>
								<td>CPU</td>
								<td>内存大小</td>
								<td>Total paging space</td>
								<td>浏览器类型</td>
						</tr>
						<tr>
								<td>1698MHz</td>
								<td>512MB</td>
								<td>1.22GB</td>
								<td>Mozilla Firefox 1.5.0.4</td>
						</tr>
				</tbody>
		</table>
		<p>测量OpenLaszlo代码的性能分为两种：加载时间和响应时间。前者说明了OpenLaszlo的应用在多久之内被初始化，而后者则是衡量程序能够响应用户动作的敏捷程度，比如在通讯录应用中完成"删除"功能的时间长度。对于这两种时间，我们都在程序开始和结尾记录时间，然后将两者相减，得到最后的结果。列表4.2展示了这种方法的实现代码。</p>
		<br />
		<a name="N1016A">
				<b>列表4.2 测量响应时间</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">&lt;button width="80" text="Delete"&gt;
    &lt;method event="onclick"&gt;
        var pre = (new Date).getTime(); //记录开始执行时间
        parent.parent.parent.datapath.deleteNode();
        var cur = (new Date).getTime(); //记录结束时间
        debug.write(cur - pre); //输出
    &lt;/method&gt;
&lt;/button&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
				<a name="N10174">
						<span class="smalltitle">
								<strong>
										<font face="Arial">4.2 测试结果</font>
								</strong>
						</span>
				</a>
		</p>
		<p>我们分别对通讯录中有3条、9条和30条记录的情况做了比较。我们逐项应用上述的原则：所有表示时间的实验数据单位为毫秒（ms）。最后的结果由10次操作的平均时间得到。首先，我们将 "initstage = defer"前后的初始化时间的比较列在表4.3。可以看到，在联系人的细节视图不被加载的时候，初始化的时间有了明显的加快。</p>
		<br />
		<b>表4.3使用defer的性能比较</b>
		<br />
		<table width="443" border="1">
				<tbody>
						<tr>
								<td>记录数目</td>
								<td>initstage = defer（ms）</td>
								<td>initstage = normal（ms）</td>
								<td>降低幅度（%）</td>
						</tr>
						<tr>
								<td>3</td>
								<td>268.4</td>
								<td>3277.8</td>
								<td>91.82</td>
						</tr>
						<tr>
								<td>9</td>
								<td>433.6</td>
								<td>10816.8</td>
								<td>95.99</td>
						</tr>
						<tr>
								<td>30</td>
								<td>955.2</td>
								<td>54734.7</td>
								<td>98.25</td>
						</tr>
				</tbody>
		</table>
		<p>其次，表4.4展示了在使用"pooling"前后的响应时间。</p>
		<br />
		<b>表4.4 使用pooling的响应时间比较</b>
		<br />
		<table width="443" border="1">
				<tbody>
						<tr>
								<td>记录数目</td>
								<td>pooling = true（ms）</td>
								<td>pooling = false（ms）</td>
								<td>降低幅度（%）</td>
						</tr>
						<tr>
								<td>3</td>
								<td>28.00</td>
								<td>136.14</td>
								<td>79.43</td>
						</tr>
						<tr>
								<td>9</td>
								<td>77.00</td>
								<td>728.00</td>
								<td>89.42</td>
						</tr>
						<tr>
								<td>30</td>
								<td>467.67</td>
								<td>3079.25</td>
								<td>84.81</td>
						</tr>
				</tbody>
		</table>
		<p>最后，本文描述"lazy"选项的效果，如表4.5所示。不难看出，"lazy"选项与上述的选项不同，没有随着记录的增多而对性能有显著的改善。显然，这是因为"lazy"针对的是单个更新视图的初始化时间，和总体记录的条数没有明显的关系。</p>
		<br />
		<b>表4.5 使用lazy的性能比较</b>
		<br />
		<table width="443" border="1">
				<tbody>
						<tr>
								<td>记录数目</td>
								<td>dataoption = true（ms）</td>
								<td>dataoption = none（ms）</td>
								<td>降低幅度（%）</td>
						</tr>
						<tr>
								<td>3</td>
								<td>838</td>
								<td>7213.6</td>
								<td>88.38</td>
						</tr>
						<tr>
								<td>9</td>
								<td>852</td>
								<td>7344.5</td>
								<td>88.40</td>
						</tr>
						<tr>
								<td>30</td>
								<td>961.4</td>
								<td>8587.1</td>
								<td>88.80</td>
						</tr>
				</tbody>
		</table>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/xml/x-cn-laszloperf/?S_TACT=105AGX52&amp;S_CMP=techcsdn#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="resources">
						<span class="atitle">参考资料 </span>
				</a>
		</p>
		<ul>
				<li>
						<a href="http://www.laszlosystems.com/lps-3.0/docs/guide/data_app.html">
								<font color="#5c81a7">Software Engineer's Guide to Developing Laszlo Applications, Chapter 33: Building Data-Driven Applications.</font>
						</a>
						<br />
						<br />
				</li>
				<li>Software Engineer's Guide to Developing Laszlo Applications, Appendix A. Understanding Instantiation. <br /><br /></li>
				<li>
						<a href="http://www.ibm.com/developerworks/cn/xml">
								<font color="#5c81a7">developerWorks 中国网站 XML 专区：http://www.ibm.com/developerworks/cn/xml</font>
						</a>
						<br />
				</li>
		</ul><img src ="http://www.blogjava.net/rain1102/aggbug/96804.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2007-01-30 23:02 <a href="http://www.blogjava.net/rain1102/archive/2007/01/30/96804.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Openlaszlo开发资料整理一:基础篇(转)</title><link>http://www.blogjava.net/rain1102/archive/2007/01/30/96738.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Tue, 30 Jan 2007 07:11:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2007/01/30/96738.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/96738.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2007/01/30/96738.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/96738.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/96738.html</trackback:ping><description><![CDATA[<table style="TABLE-LAYOUT: fixed; WORD-BREAK: break-all" cellspacing="0" cellpadding="3" width="98%" align="center" border="0">
				<tbody>
						<tr>
								<td align="middle" colspan="2">作者: 陈岳东 &#160; 发表日期: 2006-11-07 19:45 &#160; <!-- 
			<a href="javascript:" title="http://blog.lupaworld.com/article/htm/tid_3309.html" onclick="clipboardData.setData('Text','http://blog.lupaworld.com/article/htm/tid_3309.html')">复制链接</a>
			--></td>
						</tr>
						<tr>
								<td class="content" colspan="2">
										<br />
										<br />Openlaszlo开发资料整理<br />一　Laszlo简介<br />&#160; &#160; &#160; Laszlo是一个开源的RIA(Rich Internet Applications的缩写，翻译成中文为富因特网应用程序,也称Rich Internet应用程序)开发环境，遵循OSI认证的CPL许可(Common Public License)。使用Laszlo开发RIA(Rich Internet Applications的缩写，翻译成中文为富因特网应用程序,也称Rich Internet应用程序)时，只需编写名为LZX的文件（其中整合了XML和javascript，类似XUL、MXML和XAML），运行在J2EE应用服务器上的Laszlo表示服务器会将其编译成SWF文件并传输到客户端的Flash Player。 <br />&#160; &#160; Laszlo系统具备开发基于XML技术的网络应用程序，Laszlo的技术使开发者配合桌面软件快速的创建网络应用程序。这将会开发出更多快速、界面漂亮、更加有效率的流媒体应用程序，Laszlo应用看起来和桌面应用软件非常相似，但是它是一个基于XML检索数据技术的服务器开发而成。<br /><br />LZX简介：<br />　　LZX是Laszlo XML-based language的缩写，是一种基于XML的语言，用来开发RIA （ 富因特网应用程序）．利用现有的标准，例如xml、javascript，和xpath。LZX是一种基于事件驱动和面向对象的语言，用来开发动态的、基于事件驱动的程序。<br /><br />二　安装openlaszlo平台及IDE配置<br />1　下载并安装openlaszlo平台及Eclipse环境：<br />　　　在laszlo的官方网站：<a href="http://www.laszlosystems.com/" target="_blank"><font color="#5c5a5b">www.laszlosystems.com</font></a>（或者<a href="http://www.openlaszlo.org/" target="_blank"><font color="#5c5a5b">http://www.openlaszlo.org</font></a>）下载最新的安装版本openlaszlo3.３。在运行安装文件前，确保已经安装java虚拟机! 安装完后，会自动启动tomcat服务器，并启动laszlo的laszlo-explorer演示程序，大约三十秒内就该看到漂亮的系统界面了。如果看不到的话从浏览器中访问：<a href="http://127.0.0.1:8080/lps-3.2/laszlo-explorer/index.jsp" target="_blank"><font color="#5c5a5b">http://127.0.0.1:8080/lps-3.2/laszlo-explorer/index.jsp</font></a>，当你看到有3个时钟的世界地图，就表示安装成功了。打开左边的折叠菜单，可以看到里面的好多东西，还有文档等等。<br />&#160; &#160; &#160; (Java虚拟机的配置:鼠标右键单击我的电脑---&gt;属性---&gt;高级---&gt;环境变量---&gt;系统变量---&gt;新建以下三个变量<br />&#160; &#160; &#160; PATH 其值设置为%PATH%;f:\j2sdk1.4.1\bin<br />&#160; &#160; &#160; JAVA_HOME=f:\j2sdk1.4.1<br />&#160; &#160; &#160; CLASSPATH=f:\j2sdk1.4.1\lib\tools.jar<br />&#160; &#160; &#160; 注:因其版本及安装路径的不同,而路径f:\j2sdk1.4.1有可能不同,但其后的bin、lib目录都相同 <br />2　安装并配置开发工具laszloIDE：<br />&#160; 　　在<a href="http://openlaszlo.org/download-old/ide/laszloIDE-0.2.0-jdk1.5.zip" target="_blank">http://openlaszlo.org/download-old/ide/laszloIDE-0.2.0-jdk1.5.zip</a> 中下载laszloIDE插件包，找到Download from OpenLaszlo.org version 0.2.0 for JDK 1.5, WTP 1.0.版本，下载这个包，大约9M。<br />3 &#160; 设置Laszlo的开发环境<br />&#160; &#160; 确定你已经安装了OpenLaszlo 3.1 或以后的版本(3.3.3 是最新的).可从laszlo的官方网站 <a href="http://www.laszlosystems.com/" target="_blank"><font color="#5c5a5b">www.laszlosystems.com</font></a>（或者<a href="http://www.openlaszlo.org/" target="_blank"><font color="#5c5a5b">http://www.openlaszlo.org</font></a>）下载最新的安装版本openlaszlo3.３.此版本自身包含一个tomcat5.0,因此使用者不必预先安装tomcat即可运行.<br />从此网站<a href="http://download.eclipse.org/webtools/downloads/drops/R1.5/R-1.5.1-200609230508/" target="_blank"><font color="#5c5a5b">http://download.eclipse.org/webtools/downloads/drops/R1.5/R-1.5.1-200609230508/</font></a>下载Eclipse SDK 3.2.1 "all in one" zip file 版本，大约205.7MB (wtp-all-in-one-sdk-R-1.5.1-200609230508-win32.zip or wtp-all-in-one-sdk-R-1.5.1-200609230508-linux-gtk.tar.gz). WTP all-in-one 模块包含了用wtp运行软件的全部集合。这个包已经包含了与eclipse 3.2.1 sdk, emf, gef and jem.相结合的全部先决条件。你将不在需要任何其他的插件. (注:WTP是Web Tools Platform 的简称)。(注:建议初学者用all-in-one版本的Eclipse，非all-in-one配置比较麻烦。)<br /><br />配置环境:直接解压eclipse压缩包,点击eclipse目录下的eclipse.exe即可运行.接下来点击Help---&gt;Software Update---&gt;Find and Install...---&gt;Search for new features to install---&gt;next---&gt;New Archiveal site然后选中LaszloIDE-0.2.0-jdk1.5.zip并在其前面的方框中打勾,然后点击next---&gt;I accept the terms In the license argeement---&gt;next---&gt;finish,出现update Mangcr安装界面,接下来出现Verification窗口,选Install all,最后弹出Install / Update窗口,选Yes,重起eclipse即可.<br />三、基本语法及控件（标签）<br />1、文本<br />&lt;canvas width=&#8221;300&#8221; height=&#8221;200&#8221; bgcolor=&#8221;white&#8221;&gt;<br />&#160; &#160; &#160;&lt;statictext&gt;hello,would!&lt;/statictext&gt;<br />&lt;/canvas&gt;<br />Laszlo的中文问题：<br />只要在加文件头:&lt;?xml version=&#8221;1.0&#8221; encoding=&#8221;UTF-8&#8221;&gt;<br />2.按钮<br />&lt;canvas&gt;<br />&#160; &#160; &#160;&lt;button&gt;hello&lt;/button&gt;<br />&lt;/canvas&gt;<br />3.简单事件<br />&lt;canvas debug=&#8221;true&#8221;&gt;<br />&#160; &#160; &#160;&lt;button id=&#8221;mybutton&#8221; onclick=&#8221;debug.write(&#8216;button click&#8217;)&#8221;<br />Clickme&gt;<br />&lt;/button&gt;<br />&lt;/canvas&gt;<br />4.简单动画的实现<br />&lt;canvas&gt;<br />&#160; &#160; &#160;&lt;window height=&#8221;50&#8221; width=&#8221;100&#8221;&gt;<br />&#160; &#160; &#160;&lt;animatorgroup process=&#8221;sequential&#8221;&gt;<br />&#160; &#160; &#160; &#160; &#160; &#160;&lt;animator attribute=&#8221;x&#8221; to=&#8221;500&#8221; duration=&#8221;1000&#8221;&gt;<br />&#160; &#160; &#160; &#160; &#160; &#160;&lt;animator attribute=&#8221;y&#8221; to=&#8221;300&#8221; duration=&#8221;1000&#8221;&gt;<br />&lt;/animatorgroup&gt;<br />&lt;/window&gt;<br />&lt;/canvas&gt;<br />5.读取xml数据<br />&lt;canvas&gt;<br />&#160; &#160; &#160;&lt;datasetname=&#8221;dest&#8221;&gt;<br />&#160; &#160; &#160; &#160; &#160; &#160;&lt;employee&gt;<br />&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160;&lt;firstname&gt;John&lt;/firstname&gt;<br />&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160;&lt;lastname&gt;Smith&lt;/lastname&gt;<br />&#160; &#160; &#160; &#160; &#160; &#160;&lt;/employee&gt;<br />&lt;/datasetname&gt;<br />&lt;text datapath=&#8221;dset:/employee/firstname/text()&#8221;/&gt;<br />&lt;text datapath=&#8221;dest:/employee/lastname/text()&#8221;/&gt;<br />&lt;simplelayout axis=&#8221;x&#8221;/&gt;<br />&lt;/canvas&gt;<br /><br />十分钟openlaszlo入门教程:<a href="http://www.laszlosystems.com/lps/laszlo-in-ten-minutes/" target="_blank"><font color="#5c5a5b">http://www.laszlosystems.com/lps/laszlo-in-ten-minutes/</font></a><br />成熟的系统架构：openlaszlo server<br />&#160; &#160; <a href="http://www.openlaszlo.org/architecture" target="_blank"><font color="#5c5a5b">http://www.openlaszlo.org/architecture</font></a><br />丰富的组件库： <a href="http://www.openlaszlo.org/documentation/" target="_blank"><font color="#5c5a5b">http://www.openlaszlo.org/documentation/</font></a><br />完善的开发文档：<a href="http://www.openlaszlo.org/documentation/" target="_blank"><font color="#5c5a5b">http://www.openlaszlo.org/documentation/</font></a><br />众多成功商业案例：<a href="http://www.laszlosystems.com/customers/" target="_blank"><font color="#5c5a5b">http://www.laszlosystems.com/customers/</font></a><br />广为社会认可：<a href="http://www.laszlosystems.com/company/awards/" target="_blank"><font color="#5c5a5b">http://www.laszlosystems.com/company/awards/</font></a><br /></td>
						</tr>
				</tbody>
		</table><img src ="http://www.blogjava.net/rain1102/aggbug/96738.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2007-01-30 15:11 <a href="http://www.blogjava.net/rain1102/archive/2007/01/30/96738.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>