Flash / профилировщик ЦП Actionscript

Поскольку эти временные переменные определяются вашей ОС, вы можете получить информацию о том, как они вычисляются, выполнив man time в вашей оболочке (в Unix):

... Эти статистические данные состоят из (i) истекшего реального времени между вызовом и завершением, (ii) времени пользовательского ЦП (сумма значений tms_utime и tms_cutime в структуре tms, возвращаемых временами (2)), и (iii ) системное время процессора (сумма значений tms_stime и tms_cstime в структуре tms, возвращаемая временами (2)).

blockquote>

Определение указанных переменных времени может be , найденный здесь :

tms_utime Пользовательское время процессора.

tms_stime Системное время CPU.

tms_cutime Пользовательское время процессора завершенных дочерних процессов.

tms_cstime Системное время процессора завершенных дочерних процессов.

blockquote>

A пояснение различий между пользовательским и системным временем описано в ответе дароцига и в другом месте на SO :

Элемент tms_utime - это время, затраченное на выполнение вашего кода, или код в библиотеке C. Элементом tms_stime является количество времени, затраченное на выполнение кода ядра от вашего имени.

blockquote>

16
задан joeysim 10 December 2008 в 22:26
поделиться

5 ответов

Я также искал профилировщика для AS, но я хотел бесплатное программное обеспечение/решение с открытым исходным кодом, которое работает с SDK Flex и FlashDevelop. Я не нашел ни один. Таким образом, я записал простой сценарий 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;
        }
    }
}

И вот сценарий 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()

Не стесняются использовать, распределять и изменять обоих.

16
ответ дан 30 November 2019 в 17:28
поделиться

Важно отметить, что реализация Flash player отличается на каждой платформе и до степени каждый браузер, поэтому ожидайте известные различия в скорости. Таким образом, при разработке интенсивно использующего ресурсы приложения, необходимо использовать профильные инструменты, характерные для каждой ОС, Вы нацелены, как, например Инструменты на OS X и конечно проверяете производительность в каждом браузере.

2
ответ дан 30 November 2019 в 17:28
поделиться

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

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

2
ответ дан 30 November 2019 в 17:28
поделиться

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

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

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

1
ответ дан 30 November 2019 в 17:28
поделиться

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

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

2
ответ дан 30 November 2019 в 17:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: