Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1293422
  • 博文数量: 315
  • 博客积分: 10397
  • 博客等级: 上将
  • 技术积分: 3731
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-07 21:21
文章分类

全部博文(315)

文章存档

2015年(10)

2014年(3)

2013年(2)

2012年(8)

2011年(8)

2010年(29)

2009年(59)

2008年(77)

2007年(119)

分类: 系统运维

2009-07-03 14:46:01

转自:

先扯几句,team中有一个正在试运行的项目,最近被客户打了回来,问题在于flex的性能问题。症状如下,当as的service层去调用后台java servlet时,ui会弹出一个反复播放的loading动画,回调函数取得数据后进行解析,然后重绘ui。这是一个被大家普遍使用的loading+异步的客户端处理方式。但是问题在于,当执行回调函数时,本该重复执行的动画,出现了停顿状态(如果从调用到显示需要花费6秒,那么这个停顿可能就要占掉3秒),而且整个载入时间也偏长,严重影响了客户体验。

为了解决这一问题,走了不少弯路,一些可能的原因被一一排除,但是还是找不出问题所在。幸好在群友飞翔大师的提示下,把问题圈定在浏览器占用cpu过高,造成浏览器假死这一情况。一下是我排查及解决思路,希望能对大家有帮助

1、因为是cpu占用率过高引起,毋庸置疑肯定是代码造成的,于是启动从来没用过的flex profile工具来查找罪魁祸首method

选择你要检测的app后,切换到profile视图

这个对话框是让你选择监控方式,上面是内存使用情况,下面是性能(执行所花费时间)

点击按钮。

双击performance profile,会将所有初始化时执行的到函数性能都罗列出来

找到耗时最多的那个你自己写的method,就是我们要下手的目标(上图已经是优化后的截图了。之前某个method要占用1800ms左右时间)

切入代码一看,乖乖!原来是2层for循环搞得鬼,这2次循环遍历服务器返回数据然后,把他们拼装成as3的vo对象。new了成千上万个对象。cpu这么折腾一下占用率不飙上去就怪了。

解决思路,as3里没有线程概念,故不能让for循环再执行的时候来个sleep()让cup喘口气,因此我们需要借助Timer类来帮我们实现cpu喘息的功能。

Timer类的使用大家查查api应该都清楚了,new Timer(执行间隔,执行次数)。我们可以让第一层for循环转变为一次timer操作,执行次数即for的length,执行间隔即你想让cpu喘息的时间。然后再将一些变量设置成static就能替代我们的第一层for循环的功能。

ok,调优完毕,进行测试,果然cpu使用率下来了,而且动画不会产生明显的停顿,再用profile一监控,发现这一步操作由原来的1800ms降低到800ms,还节省了1秒时间,(可能是让cpu缓和一下,执行效率反而高吧)

大家在项目中遇到处理大型后台数据时,也可以借鉴这个思路,如果你由更好的解决方案,也希望一同分享。

阅读(690) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~