- 浏览: 1088429 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (695)
- 心情日记 (14)
- AS开发工具 (12)
- 文章转载 (99)
- AIR (5)
- 问题总结 (46)
- SWF格式 (7)
- 测试总结 (10)
- 外文资料 (9)
- 算法技术 (33)
- AS3常用开源库 (43)
- 源码范例 (102)
- FLEX (72)
- FLASH 优化 (33)
- 游戏开发 (49)
- 开发技术 (11)
- 工作应用 (34)
- AS3收集 (140)
- WebBase (0)
- 开发构想 (4)
- 设计模式 (2)
- 框架和框架范例 (19)
- RED5 (3)
- java开发 (3)
- JAVA (1)
- FLASH-3D (23)
- 3D (6)
- 书籍 (10)
- 业界信息资料 (3)
- C# (1)
- JavaScript (12)
- HTML5 (6)
- Flixel (1)
- D5Power RPG网页游戏引擎 (0)
- ColorMatrixFilter - 获得相应颜色的色调 函数 (0)
- Starling (0)
最新评论
-
老顽童203:
字体
水果忍者鼠标跟随特效制作[转载] -
hairball00:
[转] 放出超多的Flash组件源代码 -
he74552775:
flash AS3 RegExp简单功能用法(转) -
hanshuai1232000:
第四点,有利也有弊,等你做了大型的aprg,你就知道了
[转]位图数据内存优化 -
yangfantao:
太感谢
[转] 放出超多的Flash组件源代码
http://bbs.9ria.com/thread-74620-1-1.html
资讯类型: 原创
来源页面: http://riaoo.com/?p=2071
资讯原标题: 探讨一下是什么原因导致for each语句效率减低
资讯原作者: Y.Boy
我的评论:关于 for 、for in、for each 的效率,这是一个有趣的话题,一家一起来讨论。
对这篇文你有啥看法,跟贴说说吧!欢迎口水和板砖,哈哈。欢迎大家和我们一同分享更多资讯。
众所周知,在使用 for(var i:int=0; i<array.length; i++) 语句时,为提高效率,都把 array.length 拿在循环体外部,形如:
把 array.length 拿到外面去会提高效率,是因为减少了 array.length 语句的执行。而 Array 的 length 属性是一个 getter ,其实它相当于是一个函数,像:
减少了这个函数的执行次数,所以提高了效率。在用flash builder编写代码时,在代码提示上看到有“=”号的属性,你就要小心了,因为它是一个可能包含复杂逻辑的 getter 属性:
其实,类似的,在 for in 或 for each 语句,也应该理所当然地存在这种情况。刚看到腾讯flash开发博客上这篇文章:《另一个很容易让人忽视并影响效率的for循环写法》。我的兴致就来了,心情再次滂湃起来。文章中说道,在使用 for each 语句时,也应该把属性放在外面,就像:
假如我们把 obj.prop 写进 for each 里:for each (var o:* in obj.prop) ,给人的感觉就是:每执行一次循环,obj.prop 都被访问一次(这就是降低效率的原因了)。但,实际上,它是不是这样子的呢?现在,你开始怀疑了,其实我也在怀疑,我也很好奇。我以前看到旧同事在写代码时,就喜欢把 obj.prop 放在 for each 里,我劝告他不要这么写,obj.prop 会被多次访问的。他说无所谓的,不影响效率。最终,我认为他是正确(其实他也不知道为什么不会影响效率,-_-!!)。经过我的试验,结论是:放在 for each 里的 obj.prop 不会被多次访问,它有且只有一次被访问。在随后的多次循环时,obj.prop 都不再被访问。这种情况跟第一种情况不同。
大家不妨写个 getter 属性来测试一下:
这是类 A :
最终输出的结果是:
get obj
get obj
for each
for each
for each
for each
for each
for each
复制代码
“get obj” 只输出了两次,说明了 for each 语句里,a.obj 属性只被访问了一次。之后的循环里,都没有被访问了。我在猜想:是不是 flash player 对 a.obj 这个属性进行了缓存,效果就像把 array.length 放在循环语句外面一样!?
总结一下关于我的看法:我不知道这样分析是否正确,是否有充分的理由来说明把 a.obj 属性放在 for each 语句里不会影响效率。为了安全起见,还是统一把所有 getter 形式的属性放在最外面。
RIAMeeting如是说:
对于循环优化是子表达式消除问题(CSE),将循环引用表达式放在循环内部,据说在Java中并不会引起性能问题(即时编译优化),但AVM2的CSE实现还不是太好,所以我们需要手工优化代码。具体请参阅AVM2的核心机制说明。
标签:flash效率, for, for each, for in, getter
资讯类型: 原创
来源页面: http://riaoo.com/?p=2071
资讯原标题: 探讨一下是什么原因导致for each语句效率减低
资讯原作者: Y.Boy
我的评论:关于 for 、for in、for each 的效率,这是一个有趣的话题,一家一起来讨论。
对这篇文你有啥看法,跟贴说说吧!欢迎口水和板砖,哈哈。欢迎大家和我们一同分享更多资讯。
众所周知,在使用 for(var i:int=0; i<array.length; i++) 语句时,为提高效率,都把 array.length 拿在循环体外部,形如:
var length:uint = array.length; for(var i:int = 0; i < length; i++) { }
把 array.length 拿到外面去会提高效率,是因为减少了 array.length 语句的执行。而 Array 的 length 属性是一个 getter ,其实它相当于是一个函数,像:
public function get length():uint { // 可能包含复杂的逻辑 }
减少了这个函数的执行次数,所以提高了效率。在用flash builder编写代码时,在代码提示上看到有“=”号的属性,你就要小心了,因为它是一个可能包含复杂逻辑的 getter 属性:
其实,类似的,在 for in 或 for each 语句,也应该理所当然地存在这种情况。刚看到腾讯flash开发博客上这篇文章:《另一个很容易让人忽视并影响效率的for循环写法》。我的兴致就来了,心情再次滂湃起来。文章中说道,在使用 for each 语句时,也应该把属性放在外面,就像:
var prop:Object = obj.prop; for each (var o:* in prop) { }
假如我们把 obj.prop 写进 for each 里:for each (var o:* in obj.prop) ,给人的感觉就是:每执行一次循环,obj.prop 都被访问一次(这就是降低效率的原因了)。但,实际上,它是不是这样子的呢?现在,你开始怀疑了,其实我也在怀疑,我也很好奇。我以前看到旧同事在写代码时,就喜欢把 obj.prop 放在 for each 里,我劝告他不要这么写,obj.prop 会被多次访问的。他说无所谓的,不影响效率。最终,我认为他是正确(其实他也不知道为什么不会影响效率,-_-!!)。经过我的试验,结论是:放在 for each 里的 obj.prop 不会被多次访问,它有且只有一次被访问。在随后的多次循环时,obj.prop 都不再被访问。这种情况跟第一种情况不同。
大家不妨写个 getter 属性来测试一下:
var a:A = new A(); var obj:Object = a.obj; // 在这里 a.obj 属性被访问一次 obj.a = “a”; obj.b = “b”; obj.c = “c”; obj.d = “d”; obj.e = “e”; obj.f = “f”;for each (var o:* in a.obj) // a.obj 属性只在第一次被访问,前后总共被访问两次 { trace(“for each”);
这是类 A :
package { public class A { private var _obj:Object;public function A() { _obj = {}; }public function get obj():Object { trace(“get obj”); // 每当被访问此属性时,都会输出”get obj” return _obj; }} }
最终输出的结果是:
get obj
get obj
for each
for each
for each
for each
for each
for each
复制代码
“get obj” 只输出了两次,说明了 for each 语句里,a.obj 属性只被访问了一次。之后的循环里,都没有被访问了。我在猜想:是不是 flash player 对 a.obj 这个属性进行了缓存,效果就像把 array.length 放在循环语句外面一样!?
总结一下关于我的看法:我不知道这样分析是否正确,是否有充分的理由来说明把 a.obj 属性放在 for each 语句里不会影响效率。为了安全起见,还是统一把所有 getter 形式的属性放在最外面。
RIAMeeting如是说:
对于循环优化是子表达式消除问题(CSE),将循环引用表达式放在循环内部,据说在Java中并不会引起性能问题(即时编译优化),但AVM2的CSE实现还不是太好,所以我们需要手工优化代码。具体请参阅AVM2的核心机制说明。
标签:flash效率, for, for each, for in, getter
发表评论
-
[心得] for和for...in...遍历数组的效率,与tonyemotion版完全不同
2011-08-22 21:46 0首先tonyemotion版地址:http://bbs.9ri ... -
[转]TLF 文字布局框架的内存问题
2011-08-09 00:34 0http://bbs.airia.cn/home.php? ... -
[转]flash/actionscript3 性能优化汇总
2011-07-27 01:38 0http://www.iamcoding.com/?p=173 ... -
[转]swf / actionscript3 执行顺序
2011-07-27 01:36 0http://www.iamcoding.com/?p=198 ... -
[转]flash重绘机制总结
2011-07-27 01:35 0重绘,是flash性能的一 ... -
文字如何缩放?
2011-07-26 23:20 1262做个文件打印的东东,需要预览,就是把保存的Sprite类缩小再 ... -
AS3的一些优化计算方法
2011-07-06 12:56 0http://www.cnitblog.com/flashli ... -
[转] 关取绝对值的效率问题
2011-05-26 23:47 1525由一个项目用到很多的绝对值,我简单测试了一下,我想知道Math ... -
[转]Flash终极瘦身术--flash减k
2011-05-25 16:40 1268... -
[新手常见问题] Flash代码优化(整理)
2011-05-18 00:12 0看到代码优化就给复制发上来了,发了才发现文章太旧了,部分过时了 ... -
[转] 蛋疼的adobe,他让我蛋疼了一个下午。buttonMode的问题。。。
2011-05-16 21:05 0在为公司整理架构的时候写button组建。。。发现了一个蛋疼问 ... -
Flash的运行机制:异步单线程
2011-05-11 00:34 1954http://bbs.9ria.com/thread-4862 ... -
[心得] AS3游戏中可视对象上限及位图相关的内存消耗实测
2011-04-29 22:44 0http://bbs.9ria.com/viewthread. ... -
使用弱引用
2011-04-28 19:07 0//true表示使用弱引用 var di ... -
[转] 弱引用。
2011-04-27 01:18 0http://bbs.9ria.com/viewthread. ... -
重新关注AS垃圾回收问题
2011-04-12 00:47 0http://www.shch8.com/blog/post/ ... -
[转]Flash 平台应用性能优化官方文档
2011-04-08 19:54 01. 关于存储 使用适当 ... -
[转]位图数据内存优化
2011-03-31 15:55 2813最近协助同事对Flash相册项目做了程序优化,觉得每个优化步骤 ... -
[转]AS3中Timer,setTimeout,setInterval对gc的对比
2011-03-28 17:08 0http://hongweimail.blog.163.com ... -
[转]自制中文字库嵌入——单色图形面积压缩/加密法
2011-03-23 19:59 1996自制中文字库嵌入—— ...
相关推荐
下面,我们将深入探讨For Each循环语句在ASP编程中的应用和实例。 1. **遍历数组** 在ASP中,我们可以创建一维或多维数组,并用For Each循环来遍历数组的所有元素。例如,假设我们有一个包含学生姓名的数组: ``...
在VB(Visual Basic)编程语言中,`For Each`循环是一种非常重要的控制结构,它用于遍历集合或数组中的每一个元素。在这个实例中,我们将深入理解`For Each`循环的工作原理,以及如何在实际编程中有效地使用它。 `...
for_each 返回值详解 在 C++ STL 中,for_each 算法是一种非常有用的算法,它可以对容器中的每个元素应用一个函数对象(仿函数)。在本文中,我们将详细介绍 for_each 返回值的使用方法和实现原理。 for_each 算法...
本文将深入探讨`for`和`foreach`在C#中的效率差异,以及如何根据具体场景选择合适的循环方式。 首先,`for`循环是一种更基础的迭代结构,它允许程序员直接控制循环变量的初始化、条件检查和递增/递减过程。`for`...
本文将深入探讨其中的四个关键特性:常量、枚举、for each循环(也称为增强型for循环)以及反射。 首先,让我们来看看“常量”。在JDK 5.0之前,我们通常使用final关键字来创建不可变的变量,但这样的变量并非真正...
本文将深入探讨VBA中的“for循环”,并提供相关示例来帮助理解其工作原理。 一、For循环结构 在VBA中,For循环的基本语法如下: ```vba For 控制变量 = 初始值 To 终止值 Step 步长 '循环体,包含要重复执行的...
多重循环往往会导致计算时间显著增加,而单重循环(特别是结合`for-each`语句)可以极大地提高代码的运行速度。本篇将详细介绍如何使用MATLAB中的`for-each`循环将多重循环转换为单重循环,以提升程序性能。 `for-...
本文档主要介绍了两种重要的语句:`Select Case`语句和`For Each...In...Next`循环语句。 ### Select Case语句 #### 定义与作用 `Select Case`语句是一种多分支选择结构,用于根据不同的条件执行不同的代码块。它...
这里我们将深入探讨PB中的循环语句。 1. For 循环 PB 支持传统的For循环,这种循环适用于已知循环次数的情况。基本语法如下: ```pb For i = start_value To end_value [Step increment_value] // 循环体 Next i `...
VBScript中有四种循环语句:For...Next语句、For Each...Next语句、Do...Loop语句和While...Wend语句(不推荐使用)。在本篇文章中,我们将详细介绍每种循环语句的使用方法和场景。 一、For...Next语句 For...Next...
- 循环语句:`For...Next`、`For Each...Next`用于迭代循环,`Do...Loop`用于条件循环。 - 跳转语句:`GoTo`用于无条件跳转,`Exit`语句用于提前退出循环或子程序。 5. **数组**:VBA支持一维、二维甚至多维数组...
for each product in customerCart do begin if product.isPromotional then applyPromoDiscount(product) else if customer.isMember and customer.memberLevel = 'Gold' then applyGoldMemberDiscount(product...
### Excel-VBA中for循环语句的用法 #### 知识点概述 在Excel-VBA(Visual Basic for Applications)编程环境中,`for`循环语句是一种非常实用且常见的控制结构,它允许开发者通过简单的代码结构对一系列操作进行...
for_each遍历vector vector中可以是基本类型(int,double,char,string) 也可以是类类型
### VBA语句集(对象)与VBA语句集(流程) 在VBA(Visual Basic for Applications)中,理解并掌握控制结构和对象是非常重要的。根据提供的标题、描述及部分代码内容,我们可以深入探讨VBA中的两种核心概念:对象和...
本文主要讲解了在jQuery中如何使用each方法和for语句遍历数组,并通过实例演示了两种方法的使用技巧和效果。在深入探讨之前,我们首先需要了解数组和遍历的基本概念。数组是一种数据结构,用于存储一系列的值,而...
在Java中,有三种主要类型的循环语句:for、while和do-while。在这个主题中,我们将专注于for循环,它是Java中最常用的循环结构之一。 **for循环的基本语法** Java的for循环由三个部分组成,用分号分隔:初始化、...
让我们详细了解一下VB.Net中的这三种循环语句。 首先,我们来看Do While Loop。这种循环语句是基于条件的,它会在执行循环体之前或之后检查条件。如果条件为真,则执行循环体;如果条件为假,则跳出循环。在VB.Net...
houdini fft 使用三层for each结构 以及for 问题