blob: ac9796d03b2a671a3dcce3ce02c1f403349167f3 [file] [log] [blame]
////////////////////////////////////////////////////////////////////////////////
//
// Licensed to the Apache Software Foundation (ASF) under one or more
// contributor license agreements. See the NOTICE file distributed with
// this work for additional information regarding copyright ownership.
// The ASF licenses this file to You under the Apache License, Version 2.0
// (the "License"); you may not use this file except in compliance with
// the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
////////////////////////////////////////////////////////////////////////////////
package {
import flash.display.DisplayObject;
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.geom.Rectangle;
import flash.net.LocalConnection;
import flash.system.Capabilities;
import flash.system.System;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.utils.getQualifiedClassName;
import flash.utils.getTimer;
import flashx.textLayout.TextLayoutVersion;
import flashx.textLayout.elements.Configuration;
import flashx.textLayout.elements.TextFlow;
import flashx.textLayout.tlf_internal;
use namespace tlf_internal;
public class TimedExecution
{
private var numberOfIterations:int = 0;
private var testDescription:String;
private var sprite:Sprite;
private var beginCreationTime:int;
private var endCreationTime:int;
private var beginRenderTime:int;
// state for running tests
private var currIteration:int = -1;
private var queueResults:Boolean;
private var beginThisRender:int;
private var timingRendering:Boolean = false;
// timers
private var beginTestTime:int;
private var totalCreationTime:int;
private var totalRenderTime:int;
private var resultText:TextField;
private var func:Function;
public function TimedExecution(sprite:Sprite, numberOfIterations:int, functionToRun:Function, testDescription:String)
{
this.numberOfIterations = numberOfIterations;
func = functionToRun;
this.testDescription = testDescription;
this.sprite = sprite;
runTheTest();
}
private function getDebugMode():Boolean
{
var e:Error = new Error();
var s:String = e.getStackTrace();
// seems to work
return s ? true : false;
}
public function runTheTest():void
{
currIteration = 0;
queueResults = false;
sprite.addEventListener(Event.ENTER_FRAME,handleEnterFrame);
totalCreationTime = 0;
totalRenderTime = 0;
beginTestTime = getTimer();
}
private var totalTestTime:int;
/** generate a report at the next enter frame */
public function handleEnterFrame(e:Event): void
{
if (currIteration == -1)
return;
if (timingRendering)
{
totalRenderTime += getTimer()-beginThisRender;
timingRendering = false;
}
if (currIteration == numberOfIterations)
{
if (queueResults)
{
var memoryAllocated:Number = flash.system.System.totalMemory/1024;
trace("creation time (msecs)",totalCreationTime.toString(), "render time (msecs)",totalRenderTime.toString(), "total time (msecs)",totalTestTime.toString(), " mem (K)", memoryAllocated);
var testDescription:String = " iters: " + numberOfIterations.toString() + this.testDescription;
var playerType:String = this.getDebugMode() ? "DEBUGGING PLAYER (not suitable for measuring performance)" : "RELEASE PLAYER "+Capabilities.version;
var vellumType:String = "Vellum build: " + flashx.textLayout.TextLayoutVersion.BUILD_NUMBER + "\n" + (Configuration.tlf_internal::debugCodeEnabled ? "DEBUG vellum engine (not suitable for measuring performance)" : "RELEASE vellum engine");
resultText = new TextField();
resultText.text = testDescription + "\nCreationTime (msecs): " + totalCreationTime.toString() + "\nRenderTime (msec): " + totalRenderTime.toString() + "\nTotalTime (msec): " + totalTestTime.toString()
+ " \nmem (K): " + memoryAllocated.toString() + "\n" + playerType + "\n" + vellumType;
resultText.x = 100;
resultText.y = 140;
resultText.autoSize = TextFieldAutoSize.LEFT;
//resultText.setStyle("fontFamily", "Minion Pro");
//resultText.setStyle("fontSize", 24);
resultText.opaqueBackground = 0xf0ffff;
sprite.addChild(resultText);
currIteration = -1;
sprite.removeEventListener(Event.ENTER_FRAME,handleEnterFrame);
}
else if (!queueResults)
{
totalTestTime = getTimer()-beginTestTime;
flash.system.System.gc();
// forces gc???
try {
new LocalConnection().connect('dummy');
new LocalConnection().connect('dummy');
} catch (e:*) {}
queueResults = true;
}
}
else
{
createOneStep();
currIteration++;
timingRendering = true;
beginThisRender = getTimer();
}
}
public function createOneStep():void
{
while (sprite.numChildren)
sprite.removeChildAt(0);
var begTime:int = getTimer();
func();
totalCreationTime += getTimer()-begTime;
}
}
}