измерять различные этапы выполнения кода - PullRequest
0 голосов
/ 12 августа 2011

Есть ли способ измерить среднее время выполнения моего кода и рендеринга каждого кадра для моего приложения Flex?Более конкретно, я знаю, как использовать getTimer (), но я не уверен, какие события мне следует прослушивать, чтобы сделать это.Я читал этот пост и не уверен, как вы выясните, сколько времени потребовался фактический рендеринг (может показаться, что это может быть время между срабатыванием события RENDER и следующим срабатыванием события ENTER_FRAME, ноЯ не уверен).Кроме того, я не совсем уверен, где находится код пользователя или нужно ли мне беспокоиться о EXIT_FRAME и FRAME_CONSTRUCTED.

Любая помощь приветствуется!

РЕДАКТИРОВАТЬ ----

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

код:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600">

    <fx:Script>
        <![CDATA[
            import flash.utils.getTimer;

            public var t:Timer;
            protected function button1_clickHandler(event:MouseEvent):void
            {
                t = new Timer(40, 50);
                t.addEventListener(TimerEvent.TIMER, handleTimeTick);
                t.addEventListener(TimerEvent.TIMER_COMPLETE, timerDone);
                addEventListener(Event.RENDER, application1_renderHandler);
                addEventListener(Event.ENTER_FRAME, application1_enterFrameHandler);
                addEventListener(Event.EXIT_FRAME, application1_exitFrameHandler);
                addEventListener(Event.FRAME_CONSTRUCTED, application1_frameConstructedHandler);
                t.start();
            }

            protected function handleTimeTick(e:TimerEvent):void
            {
                shape.x += 5;
            }

            protected function timerDone(e:TimerEvent):void
            {
                t.stop();
                t.removeEventListener(TimerEvent.TIMER, handleTimeTick);
                t.removeEventListener(TimerEvent.TIMER_COMPLETE, timerDone);
                removeEventListener(Event.RENDER, application1_renderHandler);
                removeEventListener(Event.ENTER_FRAME, application1_enterFrameHandler);
                removeEventListener(Event.EXIT_FRAME, application1_exitFrameHandler);
                removeEventListener(Event.FRAME_CONSTRUCTED, application1_frameConstructedHandler);
            }

            protected function application1_renderHandler(event:Event):void
            {
                trace("render fire", getTimer());
            }

            protected function application1_enterFrameHandler(event:Event):void
            {
                trace("enter frame fire", getTimer());
            }

            protected function application1_exitFrameHandler(event:Event):void
            {
                trace("exit frame fire", getTimer());
            }

            protected function application1_frameConstructedHandler(event:Event):void
            {
                trace("frame constructed fire", getTimer());
            }

        ]]>
    </fx:Script>


    <s:Rect id="shape" x="0" y="0" height="20" width="20">
        <s:fill>
            <s:SolidColor color="0xff0000"/>
        </s:fill>
    </s:Rect>

    <s:Button x="10" y="100" click="button1_clickHandler(event)" label="go"/>
</s:Application>

Ответы [ 3 ]

2 голосов
/ 12 августа 2011

Простой способ проверить время, необходимое для запуска "кадра".Вот быстрый пример.Это не проверено, но вы поняли.Также стоит взглянуть на Грант Скиннерс о производительности и частоте кадров.

1 голос
/ 12 августа 2011

Любое приложение Flex имеет только два кадра. Первый кадр - это запуск / инициализация инфраструктуры, а второй - ваше приложение.

частота кадров установлена ​​для тега приложения Flex, и по умолчанию используется 24 кадра в секунду. Поэтому для визуализации фреймов вашего приложения требуется Flex 1/24 секунды.

Однако вполне вероятно, что для выполнения вашего кода требуется более одного кадра, и я считаю, что это то, что вы хотите измерить.

Для некоторого фонового чтения вы должны изучить Flex Elastic Racetrack о том, как Flex делит каждый кадр для различных типов обработки.

Тогда прочитайте, если вы еще этого не сделали, о Flex Component LifeCycle . ( Версия Flex 3 ).

Вы уже упоминали метод getTimer () . Суть в том, чтобы использовать getTimer () в двух точках и сравнить два значения. Что эти две точки полностью зависит от того, что вы хотите измерить.

Если вы хотите измерить время, необходимое компоненту Flex для прохождения процесса запуска, используйте getTimer () перед его созданием (AKA new Component ()), а затем в прослушивателе для события creationComplete этого компонента.

Если вы хотите определить время полной настройки приложения, лучше всего получить значение в preinitialize обработчике события основного тега Application и в applicationComplete обработчик того же тега.

Это помогает?

0 голосов
/ 12 августа 2011

Хорошо, после прочтения большого количества информации в Интернете, я думаю эта презентация дает наилучшую информацию о том, как измерить время упругой трассы (см., Например, этот фрагмент кода из презентации).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...