编译Flex应用程序而无需调试? flex编译器的优化选项?

时间:2009-05-15 09:46:13

标签: flex optimization debugging compilation trace

我创建了一个简单的测试应用程序 使用以下代码

var i : int;
for (i=0; i<3000000; i++){
   trace(i);
}

当我运行应用程序时,加载速度非常慢,这意味着“跟踪”正在运行。 我通过右键单击检查Flash播放器,调试器选项未启用。

所以我想知道是否有一个选项可以放入编译器来排除跟踪。 否则,我必须手动删除程序中的所有跟踪。

是否还有其他编译器选项可以最大限度地优化Flex应用程序?

7 个答案:

答案 0 :(得分:3)

Flex内置了一个非常好的功能,称为日志记录API(您可以在此处阅读更多相关信息http://livedocs.adobe.com/flex/3/html/logging_09.html)。

基本上,您以不同的方式记录(跟踪)事物,不可否认,代码略多于标准跟踪,但它允许您更大的灵活性。这是一个例子:

import mx.logging.Log;
Log.getLogger("com.edibleCode.logDemo").info("This is some info");
Log.getLogger("com.edibleCode.logDemo").error("This is an error");

然后,您需要做的就是在主应用程序文件中创建跟踪目标,例如:

<mx:TraceTarget id="logTarget" fieldSeparator=" - " includeCategory="true" includeLevel="true" includeTime="true">

            <mx:filters>
                <mx:Array>
                    <mx:String>*</mx:String>
                </mx:Array>
            </mx:filters>

            <!--
            0 = ALL, 2 = DEBUG, 4 = INFO, 6 = WARN, 8 = ERROR, 1000 = FATAL
            -->
            <mx:level>0</mx:level>

    </mx:TraceTarget>

使用以下命令注册跟踪:

Log.addTarget(logTarget);

这比正常的跟踪提供了几个好处:

  • 您可以过滤(关闭)跟踪以仅查看您想要的内容:
    • 通过修改过滤器数组
    • 或仅显示错误或致命消息的级别
  • 您可以使用任何其他类型的日志记录界面替换跟踪目标,例如
    • TextField
    • 文本文件

答案 1 :(得分:3)

使用条件编译,更多here

在您的代码集中:

CONFIG::debugging { 
    trace(i);
}

然后转到Project-&gt; Properties-&gt; Flex Compiler并添加

-define=CONFIG::debugging,false
or
-define=CONFIG::debugging,true

答案 2 :(得分:2)

您可以在整个项目中进行查找/替换。搜索'trace('并替换为'// trace(')。这样就足够快,很容易撤消。

答案 3 :(得分:2)

mxmlc参数debug允许您从SWF文件添加或删除调试功能。默认情况下,命令行编译器的debug参数值为false,但在Flex Builder中,您必须手动创建非调试SWF。根据{{​​3}},添加到SWF的调试信息包括“所有源文件的行号和文件名”。没有提到trace()函数调用,我认为没有办法通过编译器参数删除它们,但是欢迎您检查链接文档以获取整个可用参数列表。

答案 4 :(得分:2)

您应该设置两个编译器选项:-debug=false -optimize=true。在Flex Builder或Eclipse中,查看Project-&gt; Properties-&gt; Flex Compiler,并填写标有“Additional compiler arguments”的框。

答案 5 :(得分:0)

转到灵活代码库目录(如果Flex Builder正在运行,则关闭它 - 如果你在运行时改变它,它会变得很快)。运行此命令以更改所有跟踪语句。我建议先将树检入git或其他东西,然后再运行diff(或者cp -r树做diff -r或其他东西)。如果你在跟踪字符串中有分号,唯一的主要情况就是搞乱了:

find . -name '*.as'   -exec perl -pe 'BEGIN{ undef $/; }s/trace([^;]*);/CONFIG::debugging { trace $1 ; };/smg;' -i {} \;

find . -name '*.mxml' -exec perl -pe 'BEGIN{ undef $/; }s/trace([^;]*);/CONFIG::debugging { trace $1 ; };/smg;' -i {} \;

然后在Project-&gt; Properties-&gt; Flex Compiler-&gt;其他编译器参数中设置以下内容:

-define=CONFIG::debugging,true -define=CONFIG::release,false

并使用:

CONFIG::release { /* code */ } 

表示“#else”子句。这是我在阅读完这个问题和答案集后选择的解决方案。

还要注意这一点:

if( foo )
{
    /*code*/
}
else
    CONFIG::debugging { trace("whoops no braces around else-clause"); };

即。如果你只有其中一个在if或else或其他块中,并且它是一个没有括号的裸块,那么无论它是否被编译出来,它都会抱怨。

答案 6 :(得分:0)

你可以做的其他事情是在某个地方定义一个名为debugMode的布尔值或外部常量.as文件中的某个东西,并在你使用的任何项目中包含这个文件。然后,在任何trace语句之前,您可以先检查此布尔值的状态。这类似于zdmytriv的回答。

不得不说,我喜欢edibleCode的回答,并期待尝试一段时间。