您是否找到了这样的工具并成功使用它?
答案 0 :(得分:16)
我也在寻找AS的分析器,但我想要一个与FlashDevelop和Flex SDK一起使用的免费软件/开源解决方案。我找不到。所以我写了一个简单的python脚本和一个更简单的AS类。该脚本基本上采用任何AS文件,并为每个函数定义添加性能分析代码(即调用该函数的总运行时间,精度为1 ms - flash.utils.getTimer()
调用的分辨率)。脚本有时会出错,但这些通常很容易手工修复。然后,您需要手动添加一行:在某个时刻将分析统计信息转储到某处。这种方法显然远非准确,但它仍然可以让您很好地了解代码中的瓶颈。我成功地将它用于100k文件。
这是AS类:
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脚本:
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()
随意使用,分发和修改两者。
答案 1 :(得分:6)
Adobe最近发布了一个名为Adobe Scout的新的分析工具:
http://gaming.adobe.com/technologies/scout/
这是旧版Flash Builder探测器的一项重大改进 - 它为您提供了详细的CPU时间细分,包括ActionScript执行和内部播放器功能,如渲染和网络。
试用期间免费 - 您只需注册免费的Creative Cloud帐户即可。之后,将继续提供免费的基本版本,并将完整版本作为付费Creative Cloud帐户的一部分提供。
答案 2 :(得分:2)
重要的是要注意,Flash Player的实现在每个平台上都是不同的,并且在每个浏览器的范围内都是不同的,所以期望显着的速度差异。因此,如果您正在开发资源密集型应用程序,则应该使用特定于您要定位的每个操作系统的分析工具,例如OS X上的Instruments,当然还要测试每个浏览器的性能。
答案 3 :(得分:2)
我使用Flex Builder 3附带的分析器,取得了一定的成功。我发现在查找内存泄漏和GC问题时特别有用。
由于所讨论的应用程序的异步性质以及[onEnterFrame]和其他内部方法给出的时间量,我在方法时间性能方面对我没那么有用,尽管我仍然能够根据输出进行一些优化。
答案 4 :(得分:2)
我前段时间基于flasm编写了一个flash分析器(http://snow.prohosting.com/bensch/flasp.html)你需要使用flasm来插入分析asm,然后运行程序。
另一种(也许)更好的方法是使用David Chang的分析代码,它根本不需要开启。 www.nochump.com/asprof /
欢呼声
答案 5 :(得分:2)
这是我个人的最爱。 请注意,它是基于java和开源构建的。 http://github.com/bengarney/PBLabsProfiler
它使用flash / flex编译器的未记录功能。 Flash Builder内置的分析器使用的相同。 是的!我已成功使用它来优化我的一些flash代码。
答案 6 :(得分:1)
Flex Builder 3包含performance and memory profiler。我没有用它,但它看起来很时髦。我不确定它是否可以用于非Flex内容,但它肯定只适用于AS3。
除此之外,多年来我发现了一些可行的方法来进行一定程度的分析。最简单的是,您显然可以构建一个FPS仪表并观察它的行为方式。有关代码繁重的应用程序的更多信息,我所做的一件事是创建一个简单的框架,在方法的开头和结尾进行getTimer()
调用并跟踪累积时间,但我从未使用过任何预先制作工具。在实践中,通常非常明显的是,代码繁重的工作存在瓶颈,在这些情况下,我只是将计时器直接放在我正在尝试优化的地方。
当渲染瓶颈时,首先要尝试的是简单地在目标FPS上发布,并使用FPS仪表跟踪实际回放何时低于目标硬件(在目标硬件上)。您可以通过调用调用refreshAfterUpdate
的1ms超时以及监视刷新之间的实际时间来获取有关呈现的更多详细信息。遗憾的是,你不能比“每次刷新”更精细 - 你无法直接看到光栅化,合成等花费了多少时间。(虽然你经常可以推断这些事情。例如,你可以启用位图缓存在矢量较大的对象上从表中取出光栅化,并观察结果。)
答案 7 :(得分:1)
我发现The Miner非常有用,非商业项目是免费的。它具有广泛的功能,但标有“Performance Profiler”的标签最有帮助。我发现这是找到代码瓶颈的好方法,或者至少知道主要原因是什么(渲染,文本,网络等)。
我花了一些时间来查找安装说明,但这很简单。在项目中包含.swc文件,然后在文档类构造函数中添加1行代码。
this.addChild(new TheMiner(true));
答案 8 :(得分:0)
有一个FlashPreloaderProfiler: http://jpauclair.net/flashpreloadprofiler
它是用actionscript编写的,不需要在后台运行的java应用程序,还有一些像Memory Profiler这样的功能。
但我也更喜欢PBLabsProfiler:)