`
hje
  • 浏览: 288247 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

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 应用内存泄露的分析与诊断

    Flex 应用内存泄露的分析与诊断主要集中在 Flex 应用程序中由于内存管理不当...通过谨慎处理对象引用、正确管理事件监听器和利用调试工具,可以有效地减少 Flex 应用中的内存泄露问题,从而提高应用的性能和稳定性。

    FLEX内存释放优化原则

    - 利用FLEX提供的性能分析工具(如Flex Performance Profiler)可以帮助开发者找出潜在的内存泄漏问题。通过这些工具,开发者可以了解哪些资源未被正确释放,以及如何改进代码以提高内存管理效率。 #### 五、总结 ...

    Flex 性能简介.pdf

    ### Flex性能简介:Flex与JavaServer Pages (JSP) 应用程序的比较 #### 引言 随着互联网技术的发展,用户体验与服务器性能成为衡量Web应用程序的重要指标。本篇文章基于一份名为“Flex 性能简介”的PDF文档内容,...

    flex性能优化文档

    Flex性能优化是一个重要的主题,特别是在开发富互联网应用(RIA)时,由于Flex对硬件资源的需求较高,优化显得尤为关键。以下是一些针对Flex性能提升的关键点: 1. **从外部加载媒体**:为了减少SWF文件的大小和加载...

    Flex 性能优化全集

    ### Flex性能优化全集 #### 引言 随着技术的发展,用户对于应用程序的要求越来越高,不仅在功能上有所期待,更注重应用的响应速度与流畅度。Adobe Flex 是一款用于构建和部署跨平台富互联网应用程序的强大工具,...

    Flex 有效的内存回收方法

    本文将深入探讨Flex中的内存回收方法,以帮助开发者优化应用性能并避免内存泄漏。 1. **垃圾收集(Garbage Collection)**: 垃圾收集是Flex中实现内存管理的主要机制。它自动追踪并释放不再使用的对象所占用的内存...

    如何使用flex的profile进行性能分析

    Flex的profile工具是一个强大的性能分析工具,它能够帮助开发者深入了解SWF文件的内存占用、函数执行时间以及内存分配情况。以下将详细介绍如何使用flex profile进行性能分析: 1. **启动性能分析工具**: - 可以...

    Flex虚拟机内存管理机制及防止内存泄漏

    在Flex应用开发中,内存管理是一个关键环节,它直接影响到程序的性能和稳定性。本篇文章将深入探讨Flex虚拟机的内存管理机制以及如何预防和处理内存泄漏问题。 内存管理在任何软件开发中都至关重要,尤其是在动态...

    flex如何进行内存优化

    在开发Flex应用时,合理的内存管理是提高应用性能的关键因素之一。本文将基于提供的文件信息,深入探讨如何更好地优化Flex内存使用,并通过具体实例阐述如何编写更加高效的Flex代码。 #### 一、内存释放 1. **及时...

    Flex内存优化说明及技巧整理.doc

    2. **使用性能优化工具**:利用Flex的性能优化工具Profile监控项目进程,了解已创建的对象及其状态,包括创建数量、内存占用情况等,以便更好地识别内存泄漏和优化点。 #### 三、开发注意事项 1. **IconUtility类...

    flex 使用profile性能分析

    【Flex性能分析】Flex是一种基于ActionScript的开源框架,用于构建富互联网应用程序(RIA)。它提供了丰富的用户界面组件和强大的数据绑定能力。在开发过程中,性能优化是必不可少的一环,而`Flex Profile`就是用于...

    flex 内存泄露管理 内存泄露

    在Flex开发中,内存泄露是一个常见的问题,它会导致应用程序占用过多的内存,影响性能甚至导致程序崩溃。本文将深入探讨Flex中可能导致内存泄露的一些常见原因,并提供相应的解决方案。 首先,事件监听是导致内存...

    Flex内存泄露问题

    14. **Flex性能分析**:使用Flex提供的性能分析工具(如FlexProfiler)来检测内存泄漏,找出潜在的问题点,并针对性地优化代码。 通过遵循上述建议,开发者可以有效地管理和减少Flex应用程序中的内存泄漏,从而提高...

    有关flex 内存泄漏memory leak介绍的ppt

    通过理解并遵循这些最佳实践,开发者可以有效地管理和减少Flex应用程序中的内存泄漏,从而提高应用的稳定性和性能。记住,理解和调试内存泄漏问题需要耐心和细心,但它对于优化Flex应用的长期健康至关重要。

    flex 图片查看组件

    Flex图片查看组件是一种基于Adobe Flex技术的用户界面组件,它专为在Web应用程序中实现高质量的图片浏览体验而设计。Flex是一种开源的、基于ActionScript的框架,用于构建富互联网应用(RIA)。这款组件允许用户在...

    Flex内存管理及相关内容.pdf

    本文旨在深入探讨Flex内存管理,特别是其垃圾回收机制,以及如何避免内存泄露,确保程序的稳定性和性能。 ### Flex内存管理与垃圾回收 Flex开发中使用的ActionScript语言内置了垃圾回收功能,该功能由ActionScript...

    FLEX内存不足,无法使用设计模式的解决办法

    这些文件可能与Adobe的附加性能增强插件(如Adobe Experience Accelerator)有关,它们可能帮助优化Flex应用的内存管理和性能,尤其是对于处理大量数据和复杂UI元素的情况。 - AdobeSWFL.dll:这个文件可能与Adobe ...

    Flex内存泄露总结

    Flex内存泄露总结主要聚焦在Flash Player的垃圾回收机制和内存管理问题上,这对于优化Flex应用程序的性能至关重要。首先,我们要理解垃圾回收的基本原理。在Flash Player中,内存的释放工作由垃圾回收器负责,它是一...

Global site tag (gtag.js) - Google Analytics