`
keren
  • 浏览: 1583662 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Flex性能,内存管理和对象缓存Cache

    博客分类:
  • Flex
阅读更多
http://wmcai.blog.163.com/blog/static/4802420091432534344/
转载一篇文章。对于如何用cache提高flex性能很有帮助。

翻译:FireYang 来源:http://www.insideria.com

在屏幕上的显示的东西直接影响到Flex应用程序的响应能力和性能。更多的东西,更加降低了应用

程序的响应速度。在这里我不做过多的实例了。这篇教程帮你在动态添加了很多UI组件的高负载情况

下,仍然有很好的性能。(这句得到胡矿和火把的大力支持,感谢)

在flex组件的生存周期中,构造函数和初始化过程是最昂贵(极大的代价)的操作。你在添加和移除

大量的复杂组件时,系统将变得十分繁忙并且应用程序的整体性能也会降低。组件越复杂,消耗越大。

在你的系统中通过对象缓存技术将减少这种冲击(也称对象池)

减少,重用,循环

当你使用对象缓存技术的时候,创建一个应用程序能使用的对象缓存器。当你用完这些对象的时候,

对象将被重新放回缓存器里这样你就可以再次重用了。这种技术减少了在运行时大量对象的创建,在

程序运行时减少了整体内存的使用量,运行应用程序所需资源也趋于稳定(减少cpu和内存的冲击),

并且使得正常应用的情况下应用程序的整体性能和可伸缩性也表现的更好。

用一个简单的项目来展示这种技术和技术的好处。这个项目中有两个应用程序。两者都实现了相同

的功能,然而一个使用了对象缓存另一个没有。这个简单的应用程序示范在每次"ENTER_FRAME"事件中

创建和移除100个“CircleRenderer”对象的时候对内存和性能的冲击。

有人认为,每个"ENTER_FRAME"事件中添加和移除100子对象的例子是不是太极端了。另一些人认为,

这个例子是基础的因为CircleRenderer对象它本身就是一个很简单的对象。复杂对象即使不像这个示

例那样频繁的创建和移除,创建和移除也需要很大资源消耗。CircleRenderer是拓展自UIComponent的

一个简单对象。它通过颜色和半径变量绘制一个圆,并在里面创建3个TextFields(文本域),分别显示:

UID字符串-颜色-半径。应用程序里所有半径,颜色和UID值都是随机产生的。

首先,让我们看一下ObjectCache对象,然后比较它们之间的差异:

public class ObjectCache

{

private static var cache : ArrayCollection;

private static const preCache : int = 100;

public static function getRenderer() : CircleRenderer

{

var renderer : CircleRenderer;

if ( cache == null )

{

cache = new ArrayCollection();

for ( var x : Number = 0; x < preCache; x ++ )

{

renderer = new CircleRenderer();

cache.addItem( renderer );

}

}

if ( cache.length <= 0 )

renderer = new CircleRenderer();

else

renderer = cache.removeItemAt( 0 ) as CircleRenderer;

return renderer;

}

public static function setRenderer( renderer : CircleRenderer ) : void

{

cache.addItem( renderer );

}

}

你将在ObjectCache类中有两个public的静态函数:getRenderer和setRenderer。getRenderer函

数是从cache中返回一个CircleRenderer对象:如果cache还没有被初始化,cache将预存100个

CircleRenderer对象。如果cache已经包含了renderer对象,它将从cache中移除并返回它。如果

cache空掉了,它将简单的new一个然后返回。setRenderer函数仅仅是将一个renderer保存到cache

中。

现在,让我们进入程序本身看看……

在每次的“ENTER_FRAME”事件中,这个“No Cache”应用程序把容器中所有的circle对象移除,

并创建100个新的对象:

private function onEnterFrame( event : Event ) : void

{

circlesContainer.removeAllChildren();

for ( var x : Number = 0; x < children; x ++ )

{

var renderer : CircleRenderer = new CircleRenderer();

RendererUtil.updateRenderer( renderer );

circlesContainer.addChild( renderer );

}

}


在每次的“ENTER_FRAME”事件中,“Cache”应用程序在容器中移除所有circle对象的时候直接放

回到cache里。然后在添加100个对象的时候又重新从cache中寻回。

private function onEnterFrame( event : Event ) : void

{

while ( circlesContainer.numChildren > 0 )

{

ObjectCache.setRenderer( circlesContainer.removeChildAt( 0 ) as CircleRenderer );

}

for ( var x : Number = 0; x < children; x ++ )

{

var renderer : CircleRenderer = ObjectCache.getRenderer();

RendererUtil.updateRenderer( renderer );

circlesContainer.addChild( renderer );

}

}


“RendererUtil.updateRenderer”方法简单设置所有随机产生值到组件上。

现在,看看结果……

在这个应用程序中,有一个性能监测类,来源这里,这个性能监测器跟踪当前内存使用情况,内存

使用情况的峰值和历史内存使用情况。注意:性能监测器使用了System.totalMemory来计算内存的使

用量。这些就是flashplayer占用的全部内存,因此不要同时运行这两个程序,否则你的结果将会是不

正确的!




我的机器是[Inte(R) Core(TM)2 Duo 2 GHz, 2 GB RAM]{这是原作者的,我的可没这么好的配

置^_^},我运行这些示例用了2分钟。chche的版本的内存使用峰值是10907648 bytes, 而non-cached

版本的峰值是19681280 bytes。这里相差了8773632 bytes, 或 8.36 MB。不仅仅是cache版本使用了更

少的内存,而且在内存和cpu使用也更趋于稳定了)。(我希望我能在flash/Flex中跟踪cpu的使用

情况,但是目前我还没有找到方法)。

两个图形有相同的横像时间轴(而纵像的轴是根据你的峰值决定的)。从图形中可以看到,noncached

版本频率更高些,内存的波动也更激烈,它也需要更加频繁的垃圾回收。

你可以在你自己的电脑上运行此应用程序(警告-这可是很耗cpu的代码):

Cache:

http://www.cynergysystems.com/blogs/blogs/andrew.trice/objectcache/Cache.html

No Cache:

http://www.cynergysystems.com/blogs/blogs/andrew.trice/objectcache/NoCache.html

你可以在这里查看源代码:

http://www.cynergysystems.com/blogs/blogs/andrew.trice/objectcache/srcview/

你可以在这里下载源代码:

http://www.cynergysystems.com/blogs/blogs/andrew.trice/objectcache/srcview/ObjectCache.zip
分享到:
评论

相关推荐

    Flex性能,内存管理和对象缓存

    ### Flex性能、内存管理和对象缓存 #### 一、引言 在开发基于Flex的应用程序时,提升性能、有效管理内存以及合理利用对象缓存是非常重要的。这些技术可以帮助开发者构建出响应迅速、资源消耗低且具有良好用户体验的...

    flex 客户端缓存

    总结起来,Flex3的客户端缓存和模块化是提升应用程序性能的重要手段。通过合理地使用这两个特性,开发者可以创建出更流畅、响应更快的富互联网应用,为用户提供更好的体验。在具体实践中,要结合项目需求和用户反馈...

    Flex客户端IE浏览器缓存问题

    例如,设置`Cache-Control: no-cache`或`Pragma: no-cache`可以指示浏览器不缓存资源。此外,通过添加一个时间戳或者版本号到URL末尾(如`?v=1.2.3`),可以使每个新的SWF版本具有唯一的URL,从而绕过缓存。 3. **...

    Flex 加载 Module

    4. **WarmC技术**:标签中的“WarmC”可能是指“Warm Cache”,在Flex模块加载中,意味着已加载过的模块在内存中保持“热”状态,即保持活动和可用,这样在下次需要时能更快地提供服务,提高了应用的响应速度。...

    Flex读取XML不刷新问题

    - **缓存控制头设置**:服务器端返回的响应头中的`Cache-Control`字段如果没有正确设置(如设置为`max-age`值较大),浏览器可能会自动缓存响应结果,从而导致Flex应用加载的XML数据没有更新。 ##### 2. **Flex框架...

    ARCGIS地图缓存

    在ARCGIS软件包中,提供了多种工具和方法来管理和创建地图缓存,包括ArcIMS Cache Builder和ArcGIS Server。 #### 二、ArcIMS缓存生成器:参数与安装 ##### (一)参数详解 ArcIMS Cache Builder是一个独立工具,...

    Flex 技术开发入门介绍

    - **配置Cache Status**:在Flex开发过程中,可以通过Cache Status来查看缓存状态,这对于优化Flex应用的性能非常重要。 #### 四、创建和部署Flex项目 1. **创建Flex项目**: - 在Flex Builder中新建一个项目,...

    AIR实例包源码 flex actionscript

    Flex是基于ActionScript的开放源代码框架,用于构建富互联网应用程序(RIA),而ActionScript是Adobe Flash Player和AIR支持的面向对象的编程语言。 在描述中提到了三个压缩子文件:“InsultDueler_source.zip”,...

    flex-环境手把手配置.docx

    在安装 Cache Status 插件时,我们可以方便的管理缓存。我们可以查看缓存中的内容,清除缓存中的内容等。 在安装好所有的插件之后,我们可以开始搭建我们的 Flex 开发环境。我们需要在 Eclipse 中设置我们的 Tomcat...

    flex与spring hibernate的整合

    使用缓存策略,如Spring的Cache Abstraction,提高数据访问速度。 10. **测试与调试**:利用Flex Builder或IntelliJ IDEA等工具进行Flex代码的调试,同时结合Spring的测试框架进行后端服务的单元测试。 整合Flex、...

    LINUX 存储管理研究.pdf

    在Linux系统中,存储管理的目标是有效地利用有限的物理内存和磁盘空间,为多个并发运行的进程提供服务。以下是关于Linux存储管理的一些主要知识点: 1. **进程控制块**:在Linux中,每个进程都有一个由`task_struct...

    Flex 入门 开发文档

    4. Cache Status插件,帮助管理浏览器缓存。 在安装完成后,要在Flex Builder中配置服务器环境,如Tomcat,并将默认浏览器设置为Firefox。在Flex Builder的偏好设置中,设置Server &gt; Runtime Environment以添加...

    spring-blazeds-reference.rar_blazeds-bin-4._flex

    为了提高系统性能,可以采用缓存策略,例如使用Spring的Cache Abstraction来缓存频繁查询的结果。此外,合理设计服务接口,避免大数据量的传输,以及利用AMF的压缩特性,都能有效提升系统响应速度。 总结,Spring与...

    ArcGIS RIA开发实践【Flex篇】

    - **可利用 Cache 机制提高性能**:REST 设计允许客户端缓存响应结果,减少往返延迟。 ##### 使用 ArcGIS Server 的 REST 接口 - **REST 服务目录**:可以通过以下 URL 访问 REST 服务目录: - Java: `...

    ArcGIS Server部署策略与性能优化

    例如,新的切图模式可以更好地适应不同比例尺的地图切片需求,提高缓存数据的管理和迁移效率。 **总结** ArcGIS Server的部署策略与性能优化是确保地理信息系统高效运行的关键。通过对部署方式、性能因子的综合...

    SQlite-源码.rar

    缓存策略包括LRU(Least Recently Used)和钟形缓存,通过有效管理内存中的数据页来提高访问速度。 5. B树(B-Tree)数据结构: SQLite使用B树存储表和索引,`btree.c`和`btree.h`包含了B树的相关实现。B树允许...

    FAS8000存储快速参考指南.pdf

    例如,FAS8060支持128 GB内存和8 TB的最大闪存,而FAS8020则分别为48 GB和3 TB。 该系列存储系统具有极高的可用性和性能,能够提供超过99.999%的正常运行时间和全面的非中断操作(NDO)。通过FlexArray,FAS8000...

    flex4+openscale2.0+geoserver开发说明

    ### Flex4 + OpenScale2.0 + GeoServer 开发说明 #### 一、概述 ...这些技术的应用极大地提高了地图数据的加载速度和用户体验,同时提供了灵活的数据管理和扩展能力。希望本文能够对您有所帮助。

    R390机架式服务器

    其内部存储空间最大可扩展至8TB,且支持FBWC(Flash Backed Write Cache)技术,提供高速缓存,保障数据安全。 在I/O和网络性能上,R3C FlexServer R390拥有丰富的扩展插槽,支持6个PCIe 3.0插槽,可以根据需求配置...

Global site tag (gtag.js) - Google Analytics