Thanks for the advice Jim, you've given me plenty of ideas for things
to try!

Iain


--- In flexcoders@yahoogroups.com, Jim Cheng <[EMAIL PROTECTED]> wrote:
>
> Hi Iain,
> 
> I've been working a project quite similar to yours for a while now have 
> encountered the same issues, particularly when handling large data sets 
> (e.g. 1000+ items) with the Adobe Flex charting components, even if
only 
> a small subset is being displayed.
> 
> The core performance issue that I've found is that some parts of the 
> charting framework, particularly the axes and transforms, utilize
rather 
> inefficient algorithms that scale poorly with increasing data set size. 
>     As a result, while several series consisting of a handful of points 
> can be drawn very quickly, the framerate becomes unacceptably slow if 
> you are plotting multiple series consisting of hundreds of points of
each.
> 
> For best performance with large data sets, you must either reduce the 
> size of data that you're passing into the charts or replace these 
> algorithms with more efficient implementations.  A lot of Adobe's code 
> runs in O(n) or worse time.  You don't want this.  In my case, the 
> solution isn't particularly pretty or fun.  I ended up with a blend of 
> different approaches to reduce the total workload needed to calculate 
> and render the charts.
> 
> First off, you'll realize the biggest gain by culling the number of
data 
> points passed to your chart(s), either by lowering the chart resolution 
> with sparser data points or pre-culling the points that will not be 
> displayed on the chart from its data provider rather than depending on 
> the chart to do this via setting the minimum and maximum properties. 
> The charting framework does not do this calculation in a very efficient 
> manner, you're better off doing this yourself externally or overriding 
> it in a subclass with a more efficient search scheme (e.g. a binary 
> search tree).  The same is true for various other chart calculations, 
> including the automatic calculation of minimum and maximum values for 
> computing axial ranges--you can save quite a few cycles here if you can 
> compute this more efficiently than iterating through the entire data 
> provider (e.g. better selection algorithms).  Depending on how you're 
> using the charting framework, you'll be best served by profiling your 
> application using the Flex Profiler and looking for hotspots where you 
> might be able to make overriding changes to reduce the magnitude of the 
> calculation.
> 
> This being done, be very sure that you're not redrawing your charts
more 
> often than absolutely necessary.  This can't really be helped much if 
> you're animating your chart, so you may want to reduce this to a
minimum 
> or perhaps drop down to a sparser data set when animating.  Also, if 
> you're doing a lot of subclassing, be sure that you're only drawing
what 
> truly needs to be updated--in my case, I've found that my class may not 
> always need a redraw even if it is notified as such.  In some cases, 
> intelligent caching here may also help in reduce the computational load.
> 
> Last, if you need to do complex and time-consuming calculation loops 
> that consume more than several dozen milliseconds or so (and will 
> consequently pull down your framerate), consider breaking up your loop 
> across multiple frames.  There are several ways you can do this,
perhaps 
> with a visitor pattern or by breaking out of your loop after so many 
> iterations and storing your variables such that further execution
can be 
> resumed on the next frame.
> 
> Hope this helps,
> 
> Jim Cheng
> EffectiveUI
>


Reply via email to