<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Carbon Five Community &#187; Flex/Flash</title>
	<atom:link href="http://blog.carbonfive.com/category/flexflash/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.carbonfive.com</link>
	<description></description>
	<lastBuildDate>Fri, 27 Aug 2010 00:24:40 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>SmartyCard Launches!</title>
		<link>http://blog.carbonfive.com/2009/03/flexflash/smartycard-launches</link>
		<comments>http://blog.carbonfive.com/2009/03/flexflash/smartycard-launches#comments</comments>
		<pubDate>Wed, 18 Mar 2009 23:49:46 +0000</pubDate>
		<dc:creator>don</dc:creator>
				<category><![CDATA[Clients]]></category>
		<category><![CDATA[Flex/Flash]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://blog.carbonfive.com/?p=564</guid>
		<description><![CDATA[Our client SmartyCard launched in early March at the DEMO conference picking up the People&#8217;s Choice Award.  SmartyCard is a learning site that offers kids rewards for completing a variety of interactive learning games.  Kids are able to &#8216;learn, earn and play&#8217; grade-appropriate games while earning real and virtual rewards.]]></description>
			<content:encoded><![CDATA[<p>Our client <a href="http://www.smartycard.com" target="_blank">SmartyCard</a> launched in early March at the DEMO conference picking up the People&#8217;s Choice Award.  SmartyCard is a <a href="http://springwise.com/education/smartycard/" target="_blank">learning site that offers kids rewards for completing a variety of interactive learning games</a>.  Kids are able to &#8216;learn, earn and play&#8217; grade-appropriate games while earning real and virtual rewards.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.carbonfive.com/2009/03/flexflash/smartycard-launches/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Agile User Experience (UX) Resources</title>
		<link>http://blog.carbonfive.com/2007/09/flexflash/agile-user-experience-ux-resources</link>
		<comments>http://blog.carbonfive.com/2007/09/flexflash/agile-user-experience-ux-resources#comments</comments>
		<pubDate>Thu, 06 Sep 2007 23:12:19 +0000</pubDate>
		<dc:creator>alon</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Flex/Flash]]></category>
		<category><![CDATA[Rescue Mission]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[sxsw]]></category>

		<guid isPermaLink="false">http://blog/?p=17</guid>
		<description><![CDATA[For the seven years that we have been evolving our Extreme Programming practice, we have repeatedly readdressed the question of how to best integrate user experience design (visual design, information architecture,&#8230;) with an agile process. As a consulting company, it has always been a requirement that we flex our process to accommodate our clients and [...]]]></description>
			<content:encoded><![CDATA[<p>For the seven years that we have been evolving our Extreme Programming practice, we have repeatedly readdressed the question of how to best integrate user experience design (visual design, information architecture,&#8230;) with an agile process. As a consulting company, it has always been a requirement that we flex our process to accommodate our clients and partners. Over the last year or two we have found our clients and partners increasingly interested in flexing their processes to work more agile and collaboratively with us.</p>
<p>The post is the first of a series on user experience (UX) design practices for agile software development teams. In an upcoming project with our partner Hot Studios we will be exploring new ways to integrate their user experience design process with our software development process. We&#8217;ll share some learnings from that, experiences from the past and new ideas for the future.</p>
<p>First we have a growing reading list of existing resources on the topic that I am posting here for you. If you have other resources for us, please share.</p>
<p><a href="http://timiti.blogspot.com/2008/02/user-research-as-commodity.html">User Research as a Commodity</a><br />
<i>Added 2008-02-14</i><br />
Alex at Pivotal Labs <a href="http://pivots.pivotallabs.com/users/alex/blog/articles/400-user-research-as-a-commodity">noted this post</a> from a user experience manager at Kaiser Permanente who describes a strategy for including regular user testing in an agile development process. The strategy is attractive because it fits with a key characteristic of agile where simple practices performed regularly produce high level complex results.</p>
<p><a href="http://web.archive.org/web/20070313205440/http://www.fawcette.com/interviews/beck_cooper/">Kent Beck v. Alan Cooper</a><br />
This is a 2002 article with the following abstract &#8220;Kent Beck is known as the father of &#8216;extreme programming,&#8217; a process created to help developers design and build software that effectively meets user expectations. Alan Cooper is the prime proponent of interaction design, a process with similar goals but different methodology. We brought these two visionaries together to compare philosophies, looking for points of consensus—and points of irreconcilable difference.&#8221; The difference in perspective between the two is very expressive of the conflicts we have seen between design and agile development processes. Many of the following resources reference this discussion.</p>
<p><i>Note: the original source for this great interview appears to have been taken over by another entity that is no longer making the article available. I am linking to it in the <a href="http://www.archive.org">Internet Archive</a>.</i></p>
<p><a href="http://www.disambiguity.com/waterfall-bad-washing-machine-good-ia-summit-07-slides/">Waterfall Bad, Washing Machine Good</a><br />
Leisa Reichelt&#8217;s IA Summit 07 presentation on the role of IA in the design process identifies the failures of a waterfall design process and argues that an agile, iterative design process is superior. Slide 14 is right on.</p>
<p><a href="http://www.agilemodeling.com/essays/agileUsability.htm">User Experience Activities on Agile Development Projects</a><br />
Recent article by Scott Ambler addresses the gap between Beck and Cooper by identifying a middle ground that requires UX and agile practitioners to learn a bit more about each others&#8217; practices and to adopt some of each.</p>
<p><a href="http://agileproductdesign.com/blog/index.html">Holistic Product Design &amp; Development</a><br />
A series of blog posts by Jeff Patton on agile software development and user centered design. Jeff moderates the <span class="nobr"><a href="http://tech.groups.yahoo.com/group/agile-usability/">agile-usability Yahoo group</a></span>.</p>
<p><a href="http://tech.groups.yahoo.com/group/agile-usability/">Agile Usability Yahoo! Group</a><br />
The description for this group provides a good summary of the issues we are tackling here. You are invited to jump into the fray.</p>
<p><a href="http://www.agilelogic.com/files/ExperiencesIntegratingUEDPractices.pdf">Experiences Integrating UED Practices</a><br />
In this experience report Paul Hodgetts presents his &#8220;teams&#8217; struggles to come to grips with the often programming-centric orientation of agile processes, and their ongoing efforts to integrate their UED (user experience design) best practices into the incremental, collaborative world of agile processes.&#8221; He provides an overview to the range of UX practices, identifies challenges and discusses practices that he found were particularly useful in integrating UX and and agile development.</p>
<p><a href="http://lists.interactiondesigners.com/htdig.cgi/discuss-interactiondesigners.com/2004-March/001083.html">Agile User-Centered Design</a><br />
A post to ID-discuss that presents one designer&#8217;s struggle to reconcile agile and user-centered design.</p>
<p><a href="http://www.foruse.com/articles/agiledesign.pdf">Process Agility and Software Usability: Toward Lightweight Usage-Centered Design</a><br />
2001 paper by Larry Constantine presents concrete practices for UX that map to agile practices. His approach is simple and pragmatic.</p>
<p><a href="http://www.slideshare.net/theinfonaut/are-agile-projects-doomed-to-halfbaked-design/">The Challenge of Agile Design</a><br />
These are slides from a talk given by our friends at Pivotal Labs and Satisfaction.</p>
<p><a href="http://agiletoolkit.libsyn.com/index.php?post_id=15584">User Centered Design Round Table</a><br />
Podcast of a discussion on user-centered design and agile development with Lynn Miller, Jeff Patton and Rebecca Wirfs-Brock.</p>
<p><i>Originally posted 2007-09-06</i><br />
<i>Last updated 2008-02-14</i></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.carbonfive.com/2007/09/flexflash/agile-user-experience-ux-resources/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Macromedia Flash Remoting Update</title>
		<link>http://blog.carbonfive.com/2005/10/flexflash/macromedia-flash-remoting-update</link>
		<comments>http://blog.carbonfive.com/2005/10/flexflash/macromedia-flash-remoting-update#comments</comments>
		<pubDate>Fri, 28 Oct 2005 18:21:09 +0000</pubDate>
		<dc:creator>alon</dc:creator>
				<category><![CDATA[Flex/Flash]]></category>

		<guid isPermaLink="false">http://blog/?p=9</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<p>Macromedia has quietly released what they are calling the <a href="http://www.macromedia.com/go/46f3d4ac">Flash Remoting MX for Java Hot Fix</a>. While this update does not appear to be mentioned from the <a href="http://www.macromedia.com/software/flashremoting/">Flash Remoting product page</a> it is a fairly significant update that provides a number of configuration options for customizing and extending the behavior of the Flash Remoting gateway.</p>
<p/>
This release appears to be the same version of Flash Remoting that is distributed with Macromedia Flex. It bundles the Carbon Five <a href="http://carbonfive.sourceforge.net/astranslator/">ASTranslator</a> library for JavaBean-style serialization and allows the use of custom adapters like our <a href="http://carbonfive.sourceforge.net/springadapter/">SpringBeanAdapter</a> for using Flash Remoting with the Spring Framework.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.carbonfive.com/2005/10/flexflash/macromedia-flash-remoting-update/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>SpringBeanAdapter for Flex Flash Remoting</title>
		<link>http://blog.carbonfive.com/2005/07/flexflash/springbeanadapter-for-flex-flash-remoting</link>
		<comments>http://blog.carbonfive.com/2005/07/flexflash/springbeanadapter-for-flex-flash-remoting#comments</comments>
		<pubDate>Tue, 05 Jul 2005 19:02:17 +0000</pubDate>
		<dc:creator>alon</dc:creator>
				<category><![CDATA[Flex/Flash]]></category>

		<guid isPermaLink="false">http://blog/?p=5</guid>
		<description><![CDATA[The Spring Framework is a popular open source framework for managing enterprise Java application components. SpringBeanAdapter provides the ability to locate Flash Remoting services in a Spring application context. Additionally, it provides the ability for server-side developers to exercise custom control over the handling of server-side errors. We have documented and released this implementation on [...]]]></description>
			<content:encoded><![CDATA[<p>The <a href="http://www.springframework.org/">Spring Framework</a> is a popular open source framework for managing enterprise Java application components. SpringBeanAdapter provides the ability to locate Flash Remoting services in a Spring application context. Additionally, it provides the ability for server-side developers to exercise custom control over the handling of server-side errors.</p>
<p/>
We have <a href="http://carbonfive.sourceforge.net/springadapter/">documented</a> and <a href="http://sourceforge.net/project/showfiles.php?group_id=52145&#038;package_id=157148">released</a> this implementation on our Sourceforge Open Source site.</p>
<p>SpringBeanAdapter is designed to be used with <a target="_top" href="http://www.macromedia.com/software/flashremoting/">Macromedia Flash Remoting MX</a> on any J2EE application server.<br />
This adapter only works with versions of Flash Remoting that allow registering custom adapters, specifically, the version provided with Macromedia Flex.</p>
<p>
SpringBeanAdapter is supported by <a target="_top" href="http://www.carbonfive.com">Carbon Five</a>.</p>
<ul>
<li><a href="#overview">Overview</a>
<li><a href="#features">Features</a>
<li><a href="#download">Download</a>
<li><a href="#prerequisites">Prerequisites</a>
<li><a href="#install">Install</a>
<li><a href="#usage">Usage</a>
<li><a href="#errors">Error Handling</a>
</ul>
<hr size="1">
<h4><a name="overview">Overview</a></h4>
<p>Flash Remoting comes with a number of adapters for locating remote services implemented as Java classes, EJBs, servlets, and JMX Beans.
</p>
<p>The <a target="_top" href="http://www.springframework.org/">Spring Framework</a> is a popular open source framework for managing<br />
enterprise Java application components.
</p>
<p>SpringBeanAdapter provides the ability to locate Flash Remoting services in a Spring application context.</p>
<h4><a name="features">Features</a></h4>
<ul>
<li>Locate Remoting services by bean name in Spring application context
<li>Customizable error handling of server-side exceptions
</ul>
<h4><a name="download">Download</a></h4>
<p>The latest release of SpringBeanAdapter is available for download from <a target="_top"  href="http://sourceforge.net/project/showfiles.php?group_id=52145">SourceForge.net</a>. For the adventurous, you can check out the <a target="_top" href="http://sourceforge.net/cvs/?group_id=52145">latest changes from CVS</a>.</p>
<h4><a name="prerequisites">Prerequisites</a></h4>
<p>SpringBeanAdapter depends on:</p>
<ul>
<li>The Spring Framework &#8211; <a target="_top" href="http://www.springframework.org">home page</a>
<li>Macromedia Flash Remoting (Flex version) &#8211; <a target="_top" href="http://www.macromedia.com/software/flex/">Flex home page</a>
</ul>
<h4><a name="install">Install</a></h4>
<p>To install SpringBeanAdapter you must unzip springadapter-x.x.zip and copy the following jars to your web application&#8217;s WEB-INF/lib/ directory:</p>
<ul>
<li>lib/springadapter-x.x.jar
</ul>
<p>Configure Flash Remoting to use SpringBeanAdapter by editing your Flex Flash Remoting configuration file located in WEB-INF/flex/gateway-config.xml.</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;service-adapters<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;adapter</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;color: blue;">&quot;stateless-class&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>com.carbonfive.flash.spring.SpringBeanAdapter<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/adapter<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/service-adapters<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<h4><a name="usage">Usage</a></h4>
<p>SpringBeanAdapter handles services named with a &#8216;spring://&#8217; prefix. We recommend using named remote services in Flex by adding services to your Flex configuration in WEB-INF/flex/flex-config.xml:</p>
<p/>
<p>The following is just a sample from a flex-config.xml file:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;remote-objects<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;named<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;object</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;color: blue;">&quot;LocalServiceName&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;source<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>spring://RemoteServiceName<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/source<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;type<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>stateless-class<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/type<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;allow-unnamed-access<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>false<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/allow-unnamed-access<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/object<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/named<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/remote-objects<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p/>
With this configuration, you can then use remote object services from your Flex application with:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;mx:RemoteObject</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;color: blue;">&quot;serviceName&quot;</span> <span style="color: #000066;">named</span>=<span style="color: #ff0000;color: blue;">&quot;LocalServiceName&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span></pre></div></div>

<h4><a name="errors">Error Handling</a></h4>
<p>SpreadBeanAdapter provides a nice feature for developers who want control over how errors that happen on the server are sent to the Flash client.</p>
<p/>
In the standard adapters provided by Macromedia, server errors are converted to a class, flashgateway.GatewayException, that contains the same properties as the fault object received by the Flash client:</p>
<ul>
<li>type
<li>code
<li>message
<li>details
</ul>
<p>SpringBeanAdapter allows you to provide a factory class to produce your own GatewayExceptions when an error occurs on the server. To use this feature, register a bean that implements the interface com.carbonfive.flash.spring.RemotingExceptionFactory with the name &#8216;remotingExceptionFactory&#8217; in your Spring application context. SpringBeanAdapter will look for and use this class if found.</p>
<p/>
<p>An example implementation of RemotingExceptionFactory looks like:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ExampleExceptionFactory
  <span style="color: #000000; font-weight: bold;">implements</span> java.<span style="color: #006633;">io</span>.<span style="color: #003399;">Serializable</span>, RemotingExceptionFactory
<span style="color: #009900;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #003399;">String</span> CUSTOM_CODE <span style="color: #339933;">=</span> <span style="color: #0000ff;color: blue;">&quot;Server.Custom&quot;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> throwException<span style="color: #009900;">&#40;</span><span style="color: #003399;">Throwable</span> t<span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> <span style="color: #003399;">Exception</span>
  <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>t <span style="color: #000000; font-weight: bold;">instanceof</span> <span style="color: #003399;">SecurityException</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
      GatewayException e <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> GatewayException<span style="color: #009900;">&#40;</span>t.<span style="color: #006633;">getMessage</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      e.<span style="color: #006633;">setRootCause</span><span style="color: #009900;">&#40;</span>t<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      e.<span style="color: #006633;">setCode</span><span style="color: #009900;">&#40;</span>GatewayException.<span style="color: #006633;">SERVER_AUTHORIZATION</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #000000; font-weight: bold;">throw</span> e<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #000000; font-weight: bold;">else</span> <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>t <span style="color: #000000; font-weight: bold;">instanceof</span> <span style="color: #003399;">IndexOutOfBoundsException</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
      GatewayException e <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> GatewayException<span style="color: #009900;">&#40;</span>t.<span style="color: #006633;">getMessage</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      e.<span style="color: #006633;">setRootCause</span><span style="color: #009900;">&#40;</span>t<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      e.<span style="color: #006633;">setCode</span><span style="color: #009900;">&#40;</span>CUSTOM_CODE<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #000000; font-weight: bold;">throw</span> e<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>t <span style="color: #000000; font-weight: bold;">instanceof</span> <span style="color: #003399;">Exception</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throw</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">Exception</span><span style="color: #009900;">&#41;</span> t<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">else</span> <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>t <span style="color: #000000; font-weight: bold;">instanceof</span> <span style="color: #003399;">Error</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throw</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">Error</span><span style="color: #009900;">&#41;</span> t<span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>If you do not convert the exception to a GatewayException in your implementation of RemotingExceptionFactory, it will be handled by the standard Flash Remoting exception handling process.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.carbonfive.com/2005/07/flexflash/springbeanadapter-for-flex-flash-remoting/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Flash Remoting Mystery Time</title>
		<link>http://blog.carbonfive.com/2005/07/flexflash/flash-remoting-mystery-time</link>
		<comments>http://blog.carbonfive.com/2005/07/flexflash/flash-remoting-mystery-time#comments</comments>
		<pubDate>Fri, 01 Jul 2005 15:38:39 +0000</pubDate>
		<dc:creator>alex</dc:creator>
				<category><![CDATA[Flex/Flash]]></category>

		<guid isPermaLink="false">http://blog/?p=4</guid>
		<description><![CDATA[It seems that there are some strange performance problems when Flex loads lists of data. These problems are alluded to, but not explained in the first of Matt Chotin&#8217;s excellent articles on improving remoting performance for large lists. It appears that the time required to load a list increases non-linearly with time. This means that [...]]]></description>
			<content:encoded><![CDATA[<p><img alt="remoting_performance_icon.gif" src="http://www.carbonfive.com/community/remoting_graphs/remoting_performance_icon.gif" width="200" height="125" align="right"/>It seems that there are some strange performance problems when Flex loads lists of data.  These problems are alluded to, but not explained in the first of Matt Chotin&#8217;s <a href="http://www.markme.com/mchotin/archives/cat_data_management.cfm">excellent articles</a> on improving remoting performance for large lists.  It appears that the time required to load a list increases non-linearly with time.  This means that 1 request for a 1000 item list can take much longer than 25 requests for a 40 item list.  This is why data paging is a must.  I have done some analysis of this problem and have more info, some numbers, and test code below the fold.</p>
<p>One of the first things I noticed when I began investigating the performance of remoted lists is that the delay between the time the load starts and time the data becomes accessible can be broken in to two parts.  The first is the time between the remote method call and the result handler of that call.  During this time the mouse icon is a spinning clock, but the application is still responsive.  Within the result handler all the data from the list seems to be available. The second part of the load happens after the result handler.  During this time, the application becomes unresponsive.  It is only after this time that any visual changes to the application caused by the new data will appear (though the delay exists even if there is no change to the display).  It is this time that exhibits the strange behavior.  Since I can&#8217;t explain what the application is doing during this time, I&#8217;ve dubbed it the <i>mystery time</i>.</p>
<p>My test case involves a simple remote object called TestRemote:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">test</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.io.*</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.*</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> TestRemote <span style="color: #000000; font-weight: bold;">implements</span> <span style="color: #003399;">Serializable</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">List</span> getObjects<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> number, <span style="color: #000066; font-weight: bold;">int</span> mapSize, <span style="color: #000066; font-weight: bold;">int</span> references<span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#123;</span>
    <span style="color: #003399;">List</span> data <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">ArrayList</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #003399;">Random</span> rnd <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">Random</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    TestParent parent <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> TestParent<span style="color: #009900;">&#40;</span><span style="color: #003399;">Integer</span>.<span style="color: #006633;">toString</span><span style="color: #009900;">&#40;</span>rnd.<span style="color: #006633;">nextInt</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>, rnd.<span style="color: #006633;">nextInt</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, <span style="color: #0000ff;color: blue;">&quot;Test Object &quot;</span> <span style="color: #339933;">+</span> rnd.<span style="color: #006633;">nextInt</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, testMap<span style="color: #009900;">&#40;</span>mapSize, rnd<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    TestParent parent2 <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> TestParent<span style="color: #009900;">&#40;</span><span style="color: #003399;">Integer</span>.<span style="color: #006633;">toString</span><span style="color: #009900;">&#40;</span>rnd.<span style="color: #006633;">nextInt</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>, rnd.<span style="color: #006633;">nextInt</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, <span style="color: #0000ff;color: blue;">&quot;Test Object &quot;</span> <span style="color: #339933;">+</span> rnd.<span style="color: #006633;">nextInt</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, testMap<span style="color: #009900;">&#40;</span>mapSize, rnd<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> i <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> number<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
      data.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> TestRemotingObject<span style="color: #009900;">&#40;</span><span style="color: #003399;">Integer</span>.<span style="color: #006633;">toString</span><span style="color: #009900;">&#40;</span>rnd.<span style="color: #006633;">nextInt</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>, rnd.<span style="color: #006633;">nextInt</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>,
                                      <span style="color: #0000ff;color: blue;">&quot;Test Object &quot;</span> <span style="color: #339933;">+</span> rnd.<span style="color: #006633;">nextInt</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, testMap<span style="color: #009900;">&#40;</span>mapSize, rnd<span style="color: #009900;">&#41;</span>,
                                      <span style="color: #009900;">&#40;</span>references <span style="color: #339933;">&gt;</span> <span style="color: #cc66cc;">0</span> <span style="color: #339933;">?</span> parent <span style="color: #339933;">:</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span>, <span style="color: #009900;">&#40;</span>references <span style="color: #339933;">&gt;</span> <span style="color: #cc66cc;">1</span> <span style="color: #339933;">?</span> parent2 <span style="color: #339933;">:</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">return</span> data<span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">Map</span> testMap<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> mapSize, <span style="color: #003399;">Random</span> rnd<span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#123;</span>
    <span style="color: #003399;">Map</span> testData <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">HashMap</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> j <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> j <span style="color: #339933;">&lt;</span> mapSize<span style="color: #339933;">;</span> j<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
      testData.<span style="color: #006633;">put</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;color: blue;">&quot;key&quot;</span> <span style="color: #339933;">+</span> rnd.<span style="color: #006633;">nextInt</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, <span style="color: #0000ff;color: blue;">&quot;value&quot;</span> <span style="color: #339933;">+</span> rnd.<span style="color: #006633;">nextInt</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">return</span> testData<span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">class</span> TestRemotingObject <span style="color: #000000; font-weight: bold;">extends</span> TestParent
  <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">public</span> TestParent parent <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">public</span> TestParent parent2 <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> TestRemotingObject<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> id, <span style="color: #000066; font-weight: bold;">int</span> number, <span style="color: #003399;">String</span> name, <span style="color: #003399;">Map</span> testData, TestParent parent, TestParent parent2<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
      <span style="color: #000000; font-weight: bold;">super</span><span style="color: #009900;">&#40;</span>id, number, name, testData<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">parent</span> <span style="color: #339933;">=</span> parent<span style="color: #339933;">;</span>
      <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">parent2</span> <span style="color: #339933;">=</span> parent2<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">class</span> TestParent
  <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> id<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">int</span> number<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> name<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">Map</span> testData<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> TestParent<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> id, <span style="color: #000066; font-weight: bold;">int</span> number, <span style="color: #003399;">String</span> name, <span style="color: #003399;">Map</span> testData<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
      <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">id</span> <span style="color: #339933;">=</span> id<span style="color: #339933;">;</span>
      <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">number</span> <span style="color: #339933;">=</span> number<span style="color: #339933;">;</span>
      <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">name</span> <span style="color: #339933;">=</span> name<span style="color: #339933;">;</span>
      <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">testData</span> <span style="color: #339933;">=</span> testData<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>and an MXML file with the loading timing and charting logic built in:</p>

<div class="wp_syntax"><div class="code"><pre class="mxml" style="font-family:monospace;"><span style="color: #000000;"><span style="color: #7400FF;">&lt;mx:Application</span> xmlns:mx=<span style="color: #ff0000;color: blue;">&quot;http://www.macromedia.com/2003/mxml&quot;</span> xmlns:tops=<span style="color: #ff0000;color: blue;">&quot;*&quot;</span> pageTitle=<span style="color: #ff0000;color: blue;">&quot;Test Peformance&quot;</span> backgroundColor=<span style="color: #ff0000;color: blue;">&quot;white&quot;</span><span style="color: #7400FF;">&gt;</span></span>
  <span style="color: #339933;">&lt;mx:Script&gt;&lt;![CDATA[</span>
<span style="color: #339933;">import mx.core.*;</span>
<span style="color: #339933;">import mx.utils.*;</span>
&nbsp;
<span style="color: #339933;">var MAX_ITEM_COUNT = 1000;</span>
<span style="color: #339933;">var ITEM_COUNT_INCREMENT = 20;</span>
<span style="color: #339933;">var MAP_SIZE = 10;</span>
<span style="color: #339933;">var REFERENCES = 0;</span>
&nbsp;
<span style="color: #339933;">var timesData : Array = [];</span>
<span style="color: #339933;">var loadStart : Date;</span>
<span style="color: #339933;">var loadMiddle : Date;</span>
<span style="color: #339933;">var itemCount : Number = 0;</span>
&nbsp;
<span style="color: #339933;">public function loadData()</span>
<span style="color: #339933;">{</span>
<span style="color: #339933;">  if ( loadStart != null )</span>
<span style="color: #339933;">  {</span>
<span style="color: #339933;">    var timeNow = new Date();</span>
<span style="color: #339933;">    timesData.push( { items:itemCount, loadTime:(loadMiddle.getTime() - loadStart.getTime()), mysteryTime:(timeNow.getTime()-loadMiddle.getTime()), cumulativeTime:(timeNow.getTime()-loadStart.getTime()) } );</span>
<span style="color: #339933;">    timesChart.executeBindings();</span>
<span style="color: #339933;">  }</span>
&nbsp;
<span style="color: #339933;">  itemCount += ITEM_COUNT_INCREMENT;</span>
<span style="color: #339933;">  if ( itemCount &gt; MAX_ITEM_COUNT ) return;</span>
&nbsp;
<span style="color: #339933;">  loadStart = new Date();</span>
<span style="color: #339933;">  var contentCall = remoteService.getObjects( itemCount, MAP_SIZE, REFERENCES );</span>
<span style="color: #339933;">  contentCall.resultHandler = Delegate.create(this,function( result )</span>
<span style="color: #339933;">  {</span>
<span style="color: #339933;">    trace(result[itemCount - 1].name);</span>
<span style="color: #339933;">    loadMiddle = new Date();</span>
<span style="color: #339933;">    doLater(this, &quot;loadData&quot;);</span>
<span style="color: #339933;">  });</span>
<span style="color: #339933;">}</span>
<span style="color: #339933;">]]&gt;&lt;/mx:Script&gt;</span>
  <span style="color: #000000;"><span style="color: #7400FF;">&lt;mx:RemoteObject</span> id=<span style="color: #ff0000;color: blue;">&quot;remoteService&quot;</span> named=<span style="color: #ff0000;color: blue;">&quot;TestRemote&quot;</span> showBusyCursor=<span style="color: #ff0000;color: blue;">&quot;true&quot;</span> concurrency=<span style="color: #ff0000;color: blue;">&quot;multiple&quot;</span> result=<span style="color: #ff0000;color: blue;">&quot;event.call.resultHandler( event.result );&quot;</span><span style="color: #7400FF;">/&gt;</span></span>
  <span style="color: #000000;"><span style="color: #7400FF;">&lt;mx:Button</span> label=<span style="color: #ff0000;color: blue;">&quot;load&quot;</span> click=<span style="color: #ff0000;color: blue;">&quot;loadData();&quot;</span><span style="color: #7400FF;">/&gt;</span></span>
  <span style="color: #000000;"><span style="color: #7400FF;">&lt;mx:LineChart</span> id=<span style="color: #ff0000;color: blue;">&quot;timesChart&quot;</span> marginLeft=<span style="color: #ff0000;color: blue;">&quot;5&quot;</span> height=<span style="color: #ff0000;color: blue;">&quot;100%&quot;</span> width=<span style="color: #ff0000;color: blue;">&quot;100%&quot;</span></span>
<span style="color: #000000;">                marginRight=<span style="color: #ff0000;color: blue;">&quot;5&quot;</span> dataProvider=<span style="color: #ff0000;color: blue;">&quot;{timesData}&quot;</span> showDataTips=<span style="color: #ff0000;color: blue;">&quot;true&quot;</span><span style="color: #7400FF;">&gt;</span></span>
    <span style="color: #000000;"><span style="color: #7400FF;">&lt;mx:horizontalAxis</span><span style="color: #7400FF;">&gt;</span><span style="color: #7400FF;">&lt;mx:CategoryAxis</span> dataProvider=<span style="color: #ff0000;color: blue;">&quot;{timesData}&quot;</span> categoryField=<span style="color: #ff0000;color: blue;">&quot;items&quot;</span><span style="color: #7400FF;">/&gt;</span><span style="color: #7400FF;">&lt;/mx:horizontalAxis</span><span style="color: #7400FF;">&gt;</span></span>
    <span style="color: #000000;"><span style="color: #7400FF;">&lt;mx:series</span><span style="color: #7400FF;">&gt;</span></span>
      <span style="color: #000000;"><span style="color: #7400FF;">&lt;mx:Array</span><span style="color: #7400FF;">&gt;</span></span>
        <span style="color: #000000;"><span style="color: #7400FF;">&lt;mx:LineSeries</span> yField=<span style="color: #ff0000;color: blue;">&quot;loadTime&quot;</span> form=<span style="color: #ff0000;color: blue;">&quot;curve&quot;</span> name=<span style="color: #ff0000;color: blue;">&quot;Load Time&quot;</span><span style="color: #7400FF;">/&gt;</span></span>
        <span style="color: #000000;"><span style="color: #7400FF;">&lt;mx:LineSeries</span> yField=<span style="color: #ff0000;color: blue;">&quot;mysteryTime&quot;</span> form=<span style="color: #ff0000;color: blue;">&quot;curve&quot;</span> name=<span style="color: #ff0000;color: blue;">&quot;Mystery Time&quot;</span><span style="color: #7400FF;">/&gt;</span></span>
        <span style="color: #000000;"><span style="color: #7400FF;">&lt;mx:LineSeries</span> yField=<span style="color: #ff0000;color: blue;">&quot;cumulativeTime&quot;</span> form=<span style="color: #ff0000;color: blue;">&quot;curve&quot;</span> name=<span style="color: #ff0000;color: blue;">&quot;Cumulative Time&quot;</span><span style="color: #7400FF;">/&gt;</span></span>
      <span style="color: #000000;"><span style="color: #7400FF;">&lt;/mx:Array</span><span style="color: #7400FF;">&gt;</span></span>
    <span style="color: #000000;"><span style="color: #7400FF;">&lt;/mx:series</span><span style="color: #7400FF;">&gt;</span></span>
  <span style="color: #000000;"><span style="color: #7400FF;">&lt;/mx:LineChart</span><span style="color: #7400FF;">&gt;</span></span>
  <span style="color: #000000;"><span style="color: #7400FF;">&lt;mx:Legend</span> dataProvider=<span style="color: #ff0000;color: blue;">&quot;timesChart&quot;</span> direction=<span style="color: #ff0000;color: blue;">&quot;horizontal&quot;</span><span style="color: #7400FF;">/&gt;</span></span>
<span style="color: #000000;"><span style="color: #7400FF;">&lt;/mx:Application</span><span style="color: #7400FF;">&gt;</span></span></pre></div></div>

<p>The loadData() function of this MXML file is a little strange. The mystery time only occurs after the remote call&#8217;s result handler has completed execution, so we need to time between the end of the method and then next time we can execute code.  It turns out that Flash&#8217;s doLater() method makes this easy.  It executes the given method during the next frame of the flash movie, and the mystery time must complete before the next frame is drawn/executed.  So the loadData() function records the time since the last call started, increments the item count (and stops if its reached the limit), calls the remote method, and assingns a result handler that will restart the loop by calling loadData() in a doLater() function.</p>
<p><img alt="remoting_performance_2_10.gif" src="http://www.carbonfive.com/community/remoting_graphs/remoting_performance_2_10.gif" width="475" height="296" align="right"/>Armed with this code, we can begin analysing the mystery time.  I ran many tests with different item counts, map sizes, and object references, but this graph seems to say most everything that I can say with any confidence about the problem.  The load time is the time between the remote call and the result handler.  It increases linearly with list size as we&#8217;d expect (bigger list size = bigger download = increased time). Remember that the result of the remote call is fully available at the end of the load time, so this curve represents the request to the server, the server call itself, the serialization to a remoting response, the streaming of that response, and (it appears) the deserialization of that response into Actionscript objects.</p>
<p>The mystery time is the time between the call to the result handler and the display refresh (measured as the time between the result handler and the next frame).  It&#8217;s a little difficult to see, but there&#8217;s a slight increase in slope at around 15 to 30 items.  You can also see that after around 60 items, the mystery time provides the majority of the delay between the the remote request and the response to the user.</p>
<p>In this graph, the mystery time has a spike at around 188 items.  That&#8217;s common, the peaks sometimes appear in the load time as well.  It could be many things, including garbage collection in the flash player, garbage collection in the app server (since I&#8217;m running it on the same machine), or an entirely separate process.  At any rate, I&#8217;m ignoring the spikes.</p>
<p>The most interesting curve is the time per 100 items. If the cumumlative time were linear, this curve would be a horizontal line. As you can see, it starts high and quickly decreases to a minimum.  This accounts for the overhead involved in making many many small requests as opposed to a single larger one. The minimum of this curve it the ideal (or at least fastest) paging size. Unfortunately, it isn&#8217;t consistent across tests, even with the same parameters.  It ranges from about 20 to 60, but is usually on the low side.  Between 50 and 100 items, the curve rises quickly, meaning the performance for the high side of 100 items is much worse than on the low side.  It&#8217;s not so easy to see in this graph, but the curve continues to rise gradually after 100, but slope seems to diminish as the item count continues to rise.</p>
<p><img alt="remoting_performance_map.gif" src="http://www.carbonfive.com/community/remoting_graphs/remoting_performance_map.gif" width="480" height="300" align="right"/>A curiosity of the mystery time, is that it seems to be nearly invariant over the size of the objects in the list.  In this test, the item count was kept constant at 100 as the size of the map in each object was incremented.  The load time increases linearly as we&#8217;d expect, but the mystery time increases only slightly between 0 and 25 map entries, and then remains constant.  I&#8217;ve observed this for different types of objects as well.
</p>
<p>
While the mystery time does not depend on the size of the objects, it does seem to depend on the structure of the object graph.  Specifically, references to parent objects (i.e. each object in the list referencing a single instance of a <i>container</i> object) seems to increase the mystery time well out of proportion to the actual number of items (N+1) when the item count is high (>> 100).  Since we&#8217;ve already established that the page size needs to be < 100, I'm not going to elaborate on this oddity.
</p>
<p>
The conclusions are: 1) the mystery time takes a significant if not dominant proportion of the total request time, 2) The mystery time increases non-linearly with respect to list size and remains constant with respect to object instance size, and 3) optimum paging size seems to be between 20 and 50.  I&#8217;m at a loss to explain what the mystery time is.  It&#8217;s doesn&#8217;t seem to be deserialization because the content is available before the mystery time starts.  It may be garbage collection, but it seems far to predictable for any garbage collection scheme I know of.  At any rate, I&#8217;d love to hear some theories about what&#8217;s going on here.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.carbonfive.com/2005/07/flexflash/flash-remoting-mystery-time/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
