`

探讨一下是什么原因导致for each语句效率减低

阅读更多
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 拿在循环体外部,形如:

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
  • 大小: 1.4 KB
分享到:
评论

相关推荐

    金鹰asp超速入门视频教程-033.For Each循环语句.rar

    下面,我们将深入探讨For Each循环语句在ASP编程中的应用和实例。 1. **遍历数组** 在ASP中,我们可以创建一维或多维数组,并用For Each循环来遍历数组的所有元素。例如,假设我们有一个包含学生姓名的数组: ``...

    VB For each循环实例

    在VB(Visual Basic)编程语言中,`For Each`循环是一种非常重要的控制结构,它用于遍历集合或数组中的每一个元素。在这个实例中,我们将深入理解`For Each`循环的工作原理,以及如何在实际编程中有效地使用它。 `...

    for_each 返回值

    for_each 返回值详解 在 C++ STL 中,for_each 算法是一种非常有用的算法,它可以对容器中的每个元素应用一个函数对象(仿函数)。在本文中,我们将详细介绍 for_each 返回值的使用方法和实现原理。 for_each 算法...

    For 和 Foreach 的效率问题

    本文将深入探讨`for`和`foreach`在C#中的效率差异,以及如何根据具体场景选择合适的循环方式。 首先,`for`循环是一种更基础的迭代结构,它允许程序员直接控制循环变量的初始化、条件检查和递增/递减过程。`for`...

    JDK5.0新特性 常量 、枚举、 for each、反射

    本文将深入探讨其中的四个关键特性:常量、枚举、for each循环(也称为增强型for循环)以及反射。 首先,让我们来看看“常量”。在JDK 5.0之前,我们通常使用final关键字来创建不可变的变量,但这样的变量并非真正...

    VBA循环语句

    本文将深入探讨VBA中的“for循环”,并提供相关示例来帮助理解其工作原理。 一、For循环结构 在VBA中,For循环的基本语法如下: ```vba For 控制变量 = 初始值 To 终止值 Step 步长 '循环体,包含要重复执行的...

    MATLAB工具箱大全-将多重循环转为单重循环-For-Each

    多重循环往往会导致计算时间显著增加,而单重循环(特别是结合`for-each`语句)可以极大地提高代码的运行速度。本篇将详细介绍如何使用MATLAB中的`for-each`循环将多重循环转换为单重循环,以提升程序性能。 `for-...

    VBSCRIPTy语句-语句.txt

    本文档主要介绍了两种重要的语句:`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 `...

    WEB开发 之 VBScript 循环语句.docx

    VBScript中有四种循环语句:For...Next语句、For Each...Next语句、Do...Loop语句和While...Wend语句(不推荐使用)。在本篇文章中,我们将详细介绍每种循环语句的使用方法和场景。 一、For...Next语句 For...Next...

    VBA语句三百句,语句功能有说明

    - 循环语句:`For...Next`、`For Each...Next`用于迭代循环,`Do...Loop`用于条件循环。 - 跳转语句:`GoTo`用于无条件跳转,`Exit`语句用于提前退出循环或子程序。 5. **数组**:VBA支持一维、二维甚至多维数组...

    IF嵌套循环语句

    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循环语句的用法.docx

    ### Excel-VBA中for循环语句的用法 #### 知识点概述 在Excel-VBA(Visual Basic for Applications)编程环境中,`for`循环语句是一种非常实用且常见的控制结构,它允许开发者通过简单的代码结构对一系列操作进行...

    for_each.cpp

    for_each遍历vector vector中可以是基本类型(int,double,char,string) 也可以是类类型

    VBA语句集(对象)VBA语句集(流程)

    ### VBA语句集(对象)与VBA语句集(流程) 在VBA(Visual Basic for Applications)中,理解并掌握控制结构和对象是非常重要的。根据提供的标题、描述及部分代码内容,我们可以深入探讨VBA中的两种核心概念:对象和...

    jQuery使用each方法与for语句遍历数组示例

    本文主要讲解了在jQuery中如何使用each方法和for语句遍历数组,并通过实例演示了两种方法的使用技巧和效果。在深入探讨之前,我们首先需要了解数组和遍历的基本概念。数组是一种数据结构,用于存储一系列的值,而...

    Java循环语句之for共4页.pdf.zip

    在Java中,有三种主要类型的循环语句:for、while和do-while。在这个主题中,我们将专注于for循环,它是Java中最常用的循环结构之一。 **for循环的基本语法** Java的for循环由三个部分组成,用分号分隔:初始化、...

    vb.net初学者系列【循环语句】

    让我们详细了解一下VB.Net中的这三种循环语句。 首先,我们来看Do While Loop。这种循环语句是基于条件的,它会在执行循环体之前或之后检查条件。如果条件为真,则执行循环体;如果条件为假,则跳出循环。在VB.Net...

    houdini fft 使用三层for each结构 以及for 问题

    houdini fft 使用三层for each结构 以及for 问题

Global site tag (gtag.js) - Google Analytics