进行页游开发的过程中,很多开发者都有一个习惯,在数据输出中添加trace()函数来跟踪数值 - 不进行条件编译,发布的时候也不删除。实际上大量的trace函数会降低程序的效率,我们可以用一个简单的例子来试一试。

题目:共计10万件物品,随机分配到100个盒子中。实现非常简单,首先定义一个简单的物品结构

package net.geeeknerd.base.vo
{
public class Item
{
/**
* 物品类型
**/
public var type:int = 0;
/**
* 物品id
**/
public var id:int = 0;
/**
* 物品数量
**/
public var quantity:int = 0;
}
}

测试文档类

package
{
    import flash.display.Sprite;
    import flash.text.TextField;
    import flash.utils.Dictionary;
    import flash.utils.getTimer;
     
    import net.geeeknerd.base.vo.Item;
     
    /**
     * 测试trace()对程序的影响
     **/
    public class LLTest extends Sprite
    {
        /**
         * 存放物品的容器
         **/
        private var inventory:Dictionary = new Dictionary(true);
        /**
         * 用于显示运算时间
         **/
        private var txt:TextField;
         
        public function LLTest()
        {
            txt = new TextField;
            txt.text = "no";
            this.addChild(txt);
             
            this.dicAddItems();
        }
 
         
        /**
         * 向Dictionary中添加 10万个物品,100个种类
         * */
        public function dicAddItems():void
        {
            var time1:Number = getTimer();
            var type:int;
            var item:Item;
            for(var i:int = 0;i < 100000;i++)
            {
                trace("当前进行第 " +i +" 次搜索。");
                type = Math.floor(Math.random()*100);
                 
                if(!this.inventory[type])
                {
                    item = new Item;
                    item.id = i;
                    item.type = type;
                    this.inventory[type] = item;
                    trace("物品增加: " );
                }
                else
                {
                    item = this.inventory[type];
                    item.quantity++;
                    item.id = i;
                    trace("添加了新物品: " );
                }
                 
            }
             
            trace("不使用break数组得到结果为: " + (getTimer() - time1));
            txt.text = String(getTimer() - time1);
        }
    }
}

代码中有4行trace(),在调试模式下,程序运行时间 7813 ms

如果把trace()注释掉,程序运行时间 108 ms.之间的差距显而易见。

在发布的swf下,没有去掉trace函数,舞台上的text显示时间为 404ms

去掉trace,运行时间为72ms.可见虽然发布版的swf相对于debug版本的swf有相当程度的优化,但是trace()对程序仍然在效率上有不小的影响。

通常的做法是引入条件编译:条件编译具体做法请看 Bill Yuan 的 AS3 条件编译 ,把trace全部放入debug条件下。资深的开发团队会有自己开发的调试工具,自定制的调试控制台,但是这些调试工具也会编译到debug条件下。release版本必须是非常干净的程序应用本身。


as3 中trace() 函数对效率的影响的更多相关文章

  1. PHP 中数组函数 isset 效率比 array_key_exists 更高

    PHP 中数组函数 isset 效率比 array_key_exists 更高 PHP 浏览:4194 2014年04月05日 isset 和 array_key_exists 函数都可以用来测试数组 ...

  2. AS3中ASCII码和字符互转函数

    AS3中ASCII码和字符互转函数 字符转成ASCII码: 格式:字符串变量.charCodeAt(字符位置); var str:String = “A”; trace(str.charCodeAt( ...

  3. JS中创建函数的三种方式及区别

    1.函数声明 function sum1(n1,n2){ return n1+n2; }; 2.函数表达式,又叫函数字面量 var sum2=function(n1,n2){ return n1+n2 ...

  4. 【PHP】最详细PHP从入门到精通(二)——PHP中的函数

     PHP从入门到精通 之PHP中的函数 各位开发者朋友大家好,自上次更新PHP的相关知识,得到了大家的广泛支持.PHP的火爆程度不言而喻,函数作为PHP中极为重要的部分,应诸位的支持,博主继续跟进更新 ...

  5. 2019-2-14SQLserver中function函数和存储过程、触发器、CURSOR

    Sqlserver 自定义函数 Function使用介绍 前言:         在SQL server中不仅可以可以使用系统自带的函数(时间函数.聚合函数.字符串函数等等),还可以根据需要自定义函数 ...

  6. (转)AS3 中,Function.apply、call中第一个参数的作用;与什么时候用

    http://blog.csdn.net/linjf520/article/details/8746064 大家在使用Function.apply或是call时,是否发现,第一个参数不知道怎么用,赋值 ...

  7. 关于HashMap中hash()函数的思考

    关于HashMap中hash()函数的思考 JDK7中hash函数的实现   static int hash(int h) { h ^= (h >>> 20) ^ (h >&g ...

  8. 《python解释器源码剖析》第12章--python虚拟机中的函数机制

    12.0 序 函数是任何一门编程语言都具备的基本元素,它可以将多个动作组合起来,一个函数代表了一系列的动作.当然在调用函数时,会干什么来着.对,要在运行时栈中创建栈帧,用于函数的执行. 在python ...

  9. c++中的函数重载、函数重写、函数重定义

    目录 一.函数重载 二.函数重写 三.函数重定义 为了更加深刻的理解 函数重载.重写.重定义,我们可以带着如下这两个问题去思考: 1.子类中是否可以定义父类中的同名成员?为什么? 可以,因为子类与父类 ...

随机推荐

  1. linux源码Makefile详解

    1.Makefile的作用 (1)决定编译哪些文件 (2)怎样编译这些文件 (3)怎样连接这些文件,最重要的是它们的顺序如何 2.Linux内核Makefile分类 ***************** ...

  2. linux下的共享库(动态库)和静态库

    1.什么是库在windows平台和linux平台下都大量存在着库.本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行.由于windows和linux的本质不同,因此二者库的二进制是不 ...

  3. Wince 中如何实现注册表恢复原厂设置

    理论: 使用HIVE注册表,系统在完成了第一阶段也就是加载完了boot.hv+binfs之后和加载系统HIVE注册表之前,filesys.exe都会调用OEMIoControl来查询是否需要清除保存在 ...

  4. Ubuntu中MySQL中文乱码解决

    1.以root登陆,在终端输入命令 sudo gedit /etc/mysql/my.cnf在打开的文件中找到[client]在下面加入default-character-set=utf8 找到 [m ...

  5. 面试题_89_to_92_单元测试 JUnit 面试题

    89)如何测试静态方法?(答案)可以使用 PowerMock 库来测试静态方法. 90)怎么利用 JUnit 来测试一个方法的异常?(答案) 91)你使用过哪个单元测试库来测试你的 Java 程序?( ...

  6. window注册表

    打开注册表: 可以用快捷键 win + r  ,然后输入 Regedit 回车,会打开注册表. 注册表添加一个键值对到 操作如下: 1.先创建一个 .reg 后缀的文件. 2.文件内容如下: Wind ...

  7. rapidxml使用

    以前都是用tinyxml,这次开发中解析xml配置文件像尝试一下rapidxml,据说效率很高... RapidXml Manual: http://rapidxml.sourceforge.net/ ...

  8. poj 2948 Martian Mining (dp)

    题目链接 完全自己想的,做了3个小时,刚开始一点思路没有,硬想了这么长时间,想了一个思路, 又修改了一下,提交本来没抱多大希望 居然1A了,感觉好激动..很高兴dp又有所长进. 题意: 一个row*c ...

  9. BootStrap图标

  10. C# 创建iis站点以及IIS站点属性,iis不能启动站点

    DontLog = False是否将客户端的请求写入日志文件 2011年04月09日 #region CreateWebsite 新增网站 public string CreateWebSite(st ...