首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Flash / Actionscript CPU探查器

Flash / Actionscript CPU探查器
EN

Stack Overflow用户
提问于 2008-12-10 22:26:10
回答 9查看 12.6K关注 0票数 16

你有没有找到这样的工具并成功地使用过?

EN

回答 9

Stack Overflow用户

发布于 2009-01-14 19:28:26

我也在寻找一个AS的分析器,但我想要一个可以与FlashDevelop和Flex SDK一起工作的免费软件/开源解决方案。我什么也没找到。所以我写了一个简单的python脚本和一个更简单的AS类。该脚本实质上接受任何AS文件,并将分析代码(即,以1ms的精度测量该函数的总运行时间的调用- flash.utils.getTimer()调用的分辨率)添加到每个函数定义。脚本有时会出错,但这些错误通常很容易手工修复。然后,您需要手动添加一行:在某个时刻将分析统计数据转储到某个地方。这种方法显然很不准确,但它仍然可以让你很好地感觉到代码中的瓶颈。我成功地将它用于一个100k的文件。

下面是AS类:

代码语言:javascript
复制
package  {
    public class Profiler {
        private static var instance:Profiler;

        public static function get profiler():Profiler {
            if (!Profiler.instance) Profiler.instance = new Profiler;
            return Profiler.instance;
        }

        private var data:Object = {};

        public function profile(fn:String, dur:int):void {
            if (!data.hasOwnProperty(fn)) data[fn] = new Number(0);
            data[fn] += dur / 1000.0;
        }

        public function clear():void {
            data = { };
        }

        public function get stats():String {
            var st:String = "";
            for (var fn:String in data) {
                st += fn + ":\t" + data[fn] + "\n";
            }
            return st;
        }
    }
}

下面是完成此任务的python脚本:

代码语言:javascript
复制
import sre, sys

rePOI = sre.compile(r'''\bclass\b|\bfunction\b|\breturn\b|["'/{}]''')
reFun = sre.compile(r'\bfunction\b\s*((?:[gs]et\s+)?\w*)\s*\(')
reCls = sre.compile(r'class\s+(\w+)[\s{]')
reStr = sre.compile(r'''(["'/]).*?(?<!\\)\1''')

def addProfilingCalls(body):
    stack = []
    pos = 0
    depth = 0
    retvar = 0
    klass = ""
    match = rePOI.search(body, pos)
    while match:
        poi = match.group(0)
        pos = match.start(0)
        endpos = match.end(0)

        if poi in '''"'/''':
            strm = reStr.match(body, pos)
            if strm and (poi != '/' or sre.search('[=(,]\s*$', body[:pos])):
                endpos = strm.end(0)

        elif poi == 'class':
            klass = reCls.match(body, pos).group(1)
            sys.stderr.write('class ' + klass + '\n')

        elif poi == 'function':
            fname = reFun.match(body, pos)
            if fname.group(1):
                fname = klass + '.' + fname.group(1)
            else:
                lastf = stack[-1]
                lastf['anon'] += 1
                fname = lastf['name'] + '.anon' + str(lastf['anon'])
            sys.stderr.write('function ' + fname + '\n')
            stack.append({'name':fname, 'depth':depth, 'anon':0})

            brace = body.find('{', pos) + 1
            line = "\nvar __start__:int = flash.utils.getTimer();"
            body = body[:brace] + line + body[brace:]
            depth += 1
            endpos = brace + len(line)

        elif poi == '{':
            depth += 1

        elif poi == 'return':
            lastf = stack[-1]
            semicolon = body.find(';', pos) + 1
            if sre.match('return\s*;', body[pos:]):
                line = "{ Profiler.profiler.profile('" + lastf['name'] + \
                       "', flash.utils.getTimer() - __start__); return; }"
            else:
                retvar += 1
                line = "{ var __ret" + str(retvar) + "__:* =" + body[pos+6:semicolon] + \
                       "\nProfiler.profiler.profile('" + lastf['name'] + \
                       "', flash.utils.getTimer() - __start__); return __ret" + str(retvar) + "__; }"
            body = body[:pos] + line + body[semicolon:]
            endpos = pos + len(line)

        elif poi == '}':
            depth -= 1
            if len(stack) > 0 and stack[-1]['depth'] == depth:
                lastf = stack.pop()
                line = "Profiler.profiler.profile('" + lastf['name'] + \
                    "', flash.utils.getTimer() - __start__);\n"
                body = body[:pos] + line + body[pos:]
                endpos += len(line)

        pos = endpos
        match = rePOI.search(body, pos)
    return body

def main():
    if len(sys.argv) >= 2: inf = open(sys.argv[1], 'rU')
    else: inf = sys.stdin
    if len(sys.argv) >= 3: outf = open(sys.argv[2], 'wU')
    else: outf = sys.stdout
    outf.write(addProfilingCalls(inf.read()))
    inf.close()
    outf.close()

if __name__ == "__main__":
    main()

您可以随意使用、分发和修改这两个版本。

票数 16
EN

Stack Overflow用户

发布于 2013-01-11 07:29:23

Adobe最近发布了一个新的Flash分析工具,名为Adobe Scout:

http://gaming.adobe.com/technologies/scout/

这是对旧的Flash Builder分析器的巨大改进-它给出了ActionScript执行和内部播放器功能(如渲染和网络)的CPU时间的详细细分。

它在试用期内是免费的-你只需要注册一个免费的Creative Cloud账户即可。之后,将继续提供免费的基础版,完整版将作为付费Creative Cloud帐户的一部分提供。

票数 6
EN

Stack Overflow用户

发布于 2009-01-11 17:42:06

值得注意的是,Flash Player在每个平台上的实现都是不同的,并且在一定程度上每个浏览器都是不同的,因此要期待显著的速度差异。因此,如果您正在开发资源密集型应用程序,则应该使用特定于目标操作系统的性能分析工具,例如OS上的Instruments,当然还要测试每个浏览器的性能。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/357825

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档