2008-12-10 9 views

ответ

1

Flex Builder 3 включает в себя performance and memory profiler. Я не использовал его, но он выглядит довольно эффектно. Я не уверен, что его можно использовать для контента без Flex, но он определенно будет работать только для AS3.

Кроме того, на протяжении многих лет я нашел пару работоспособных методов для определенного уровня профилирования. В простейшем случае вы можете просто построить счетчик FPS и посмотреть, как он себя ведет. Для получения дополнительной информации о приложениях с тяжелым кодом, я сделал это, чтобы взломать простую структуру для создания вызовов getTimer() в начале и конце методов и отслеживания кумулятивного времени, но я никогда не использовал готовые инструменты для что. На практике это обычно довольно очевидно, где узкие места предназначены для работы с кодовым содержанием, и в этих случаях я просто ставил таймер непосредственно вокруг того, что я пытаюсь оптимизировать.

Когда узкие места находятся в рендеринге, первое, что нужно попробовать, это просто опубликовать в своем целевом FPS и использовать измеритель FPS для отслеживания, когда фактическое воспроизведение падает ниже этого (на целевом оборудовании). Вы можете получить более подробную информацию об рендеринге, например, вызывая тайм-аут 1 мс, который вызывает refreshAfterUpdate, и контролирует фактическое время между обновлениями. К сожалению, вы не можете получить более подробный, чем «за обновление», хотя - вы не можете прямо видеть, сколько времени тратится на растеризацию, компоновку и т. Д. (Хотя вы часто можете вывести эти вещи. Например, вы можете включить кэширование растрового изображения на векторных тяжелых объектах, чтобы снять растеризацию со стола и наблюдать за результатами.)

+0

Эта ссылка указывает на введение функций Flex Builder 3 - разве это не текущая версия? – hasseg

+0

Будь ты прав, ты видишь, что я не являюсь пользователем FB. Я отредактирую для ясности, но, возможно, кто-то, более знакомый с профилировщиком FB, может добавить информацию о входе и выходе. Спасибо за улов! – fenomas

2

Важно отметить, что реализация Flash Player отличается на каждой платформе и в каждом браузере, поэтому ожидайте заметных различий в скорости. Поэтому, если вы разрабатываете ресурсоемкое приложение, вам следует использовать инструменты профилирования, специфичные для каждой ориентированной вами ОС, например, Instruments на OS X и, конечно же, проверить производительность в каждом браузере.

2

Я использовал профилировщик, который поставляется с Flex Builder 3 с умеренным успехом. Я особенно полезен в поиске утечек памяти и проблем с GC.

Это было гораздо менее полезно для меня в области производительности времени в процессе из-за асинхронного характера рассматриваемого приложения и количества времени, предоставленного [onEnterFrame] и других внутренних методов, хотя я все еще был в состоянии сделать некоторые оптимизации на основе результата.

16

Я также искал профилировщик для AS, но мне было предложено бесплатное программное обеспечение с открытым исходным кодом, которое работает с FlashDevelop и Flex SDK. Я не нашел никого. Поэтому я написал простой скрипт python и еще более простой класс AS. Скрипт по существу принимает любой файл AS и добавляет код профилирования (т. Е. Вызовы для измерения общего времени выполнения этой функции с точностью 1 мс - разрешение вызова 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; 
     } 
    } 
} 

А вот питон скрипт, который делает трюк:

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() 

Вы можете использовать, распространять и изменять оба.

+0

Ничего себе, хорошая работа! – andrewrk

+0

Я получаю сообщение об ошибке в строке 31 скрипта python: UnboundLocalError: локальная переменная 'klass', на которую ссылаются до назначения –

+0

Я добавил строку для инициализации klass в начале функции. –

2

Я написал flash-профайлер на основе flasm некоторое время назад (http://snow.prohosting.com/bensch/flasp.html) Вам нужно использовать flasm для вставки профилирования asm, а затем запустить программу.

Другим (возможно) лучшим способом является использование кода профилирования Дэвида Чанга, который вообще не требует флизы. www.nochump.com/asprof/

веселит

2

Это один мой личный фаворит. Обратите внимание, что он построен на Java и с открытым исходным кодом. http://github.com/bengarney/PBLabsProfiler

Он использует недокументированные функции компилятора flash/flex. Те же встроенные профилировщики Flash Builder. И да! Я успешно использовал его для оптимизации некоторых моих flash-кодов.

+1

Да, PushButton Labs Profiler делает работу очень хорошо! –

0

Существует FlashPreloaderProfiler: http://jpauclair.net/flashpreloadprofiler

Это написано в ActionScript, не нуждается в Java-приложение, работающее в фоновом режиме и имеют некоторые дополнительные функции, такие как Memory Profiler.

Но я предпочитаю PBLabsProfiler тоже :)

1

Я нашел The Miner быть очень полезным, и это бесплатно для некоммерческих проектов. Он имеет широкий спектр функций, но вкладка с надписью «Performance Profiler» была наиболее полезной. Я нахожу, что это отличный способ найти узкие места в вашем коде или, по крайней мере, знать, какова основная причина (рендеринг, текст, сеть и т. Д.).

Мне потребовалось немного времени, чтобы найти инструкции по установке, но это довольно просто. Включите файл .swc в свой проект, а затем добавьте 1 строку кода в свой конструктор класса документа.

this.addChild(new TheMiner(true)); 

Подробнее: http://www.sociodox.com/theminer/support.html

6

Adobe недавно выпустила новый инструмент профилирования для Flash, называется Adobe Scout:

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

Это серьезное улучшение на старом Flash Builder Profiler - это дает вам подробную разбивку времени процессора, как для выполнения ActionScript, так и для внутренних функций проигрывателя, таких как рендеринг и создание сетей.

Это бесплатно для пробного периода - вам просто нужно зарегистрироваться для бесплатной учетной записи Creative Cloud. После этого будет продолжаться свободная базовая версия с полной версией, доступной как часть платной учетной записи Creative Cloud.