施法类型会影响执行速度吗?

时间:2013-09-17 14:05:54

标签: actionscript-3

我想知道执行速度是否存在差异:

Object( e.target ).labelTextID

MovieClip( e.target ).labelTextID

e.target在这种情况下是一个MovieClip,但没关系。

3 个答案:

答案 0 :(得分:2)

没有任何区别。看看这个示例代码:

        var obj:Object = new MovieClip();
        var v1:Object = Object(obj);
        var v2:MovieClip = MovieClip(obj);

两种类型的铸件都产生相同的操作码:

        _as3_findpropstrict Object
        _as3_getlocal <1> 
        _as3_callproperty Object(param count:1)
        _as3_coerce Object
        _as3_setlocal <2> 

        _as3_findpropstrict flash.display::MovieClip
        _as3_getlocal <1> 
        _as3_callproperty flash.display::MovieClip(param count:1)
        _as3_coerce flash.display::MovieClip
        _as3_setlocal <3> 

结论也得到了基准的证实:

    var obj:Object = new MovieClip();

    var v1:Object, v2:MovieClip, i:int;
    var t:uint = getTimer();

    for(i = 0; i < 1000000; i++)
        v1 = Object(obj);

    trace("Object: ", (getTimer() - t));

    t = getTimer();
    for(i = 0; i < 1000000; i++)
        v2 = MovieClip(obj);

    trace("MovieClip: ", (getTimer() - t));

输出:

Object:  92
MovieClip:  90

答案 1 :(得分:1)

就你投射到什么类型的物体而言,我无法确定,但就你如何进行投射而言,我会看一下这个答案:https://stackoverflow.com/a/14268394/1346390

它的TLDR,使用“as”进行强制转换,因为它更快更安全,因为如果失败会抛出TypeError。

答案 2 :(得分:0)

这个演员之间必须没有区别。在这两种情况下,无论e.target的类型如何,都指示编译器显式地转换e.target。