进行页游开发的过程中,很多开发者都有一个习惯,在数据输出中添加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. 基于Jws的WebService项目

    基于Jws的WebService项目   1.服务器端建立 1.1.创建接口 [java] view plaincopy @WebService  public interface IWebServi ...

  2. 剖析MapReduce 作业运行机制

    包含四个独立的实体: ·  Client Node 客户端:编写 MapReduce代码,配置作业,提交MapReduce作业. ·  JobTracker :初始化作业,分配作业,与 TaskTra ...

  3. IOS ARC与非ARC混合编译

    要开启ARC的:-fobjc-arc不开启ARC的:-fno-objc-arc 是否使用arc: 在build setting里找automatic reference counting,YES/NO

  4. WCf的理解

    从 .NET 3.5 开始 WCF 已经支持用 WebHttpBinding 构建 RESTful Web 服务,基于 WCF 框架的 RESTful Web 服务还是建立在 WCF Message ...

  5. ifdebug

    #if DEBUG 首先,大小写不能写错. 其次,解决方案配置设为:Debug,才会执行该语句,如果在条件里面搭配Debug.Assert等,效果甚佳.而如果要设置为Release模式,就不会执行条件 ...

  6. DataGridView控件的使用---添加行

    最简单的方法 可以静态绑定数据源,这样就自动为DataGridView控件添加相应的行. 假如需要动态为DataGridView控件添加新行,方法有很多种,下面简单介绍如何为DataGridView控 ...

  7. SharePoint2010安装文档

    最低配置要求 操作系统 X64 Window Server 2008 R2 Standard 数据库 X64 SQL Server 2008 R2 CPU X64,4核 内存 8G 硬盘 100G 安 ...

  8. ACM刷题常用链接

    武汉科技大学  http://acm.wust.edu.cn/ 华中科技大学 http://acm.hust.edu.cn/vjudge/toIndex.action 杭州电子科技大学  http:/ ...

  9. 带你认识HTML5中的WebSocket

    这篇文章主要介绍了带你认识HTML5中的WebSocket,本文讲解了HTML5 中的 WebSocket API 是个什么东东.HTML5 中的 WebSocket API 的用法.带Socket. ...

  10. Jquery 模板插件 jquery.tmpl.js 的使用方法(2):嵌套each循环,temp调用(使用预编译的模板缓存)

    直接上代码吧 一:主窗口 /*#region SendChooseTargetTemplate 发送候选人主窗口模板*/ var SendChooseTargetTemplate = ''; Send ...