Flash has several ways to define a function:
- Class methods
- Setter/getter methods
- Static class methods
- Local functions
I wrote equivalent functions in each form and compared their performance. The raw data is down below in the appendix. I'll go over the results here that I find surprising:
Setter/Getters vs. Regular Instance Functions
// Setter/Getter p.XVal = 23.4; // 25 msec / 1000 x = p.XVal; // 12 msec / 1000
vs.
p.setX(23.4); // 13 msec / 1000 x = p.getX(); // 12 msec / 1000
As you can see, the equivalent getter and getX function have the same performance, but the setter is much slower than setX(). I have no idea why. Someday I'll have to flasm it to see what's going on.
Static vs. Regular Instance Functions
// Static Point.staticSetX(p,23.4); // 22 msec / 1000 x = Point.staticGetX(p); // 21 msec / 1000
vs.
// Instance p.setX(23.4); // 13 msec / 1000 x = p.getX(); // 12 msec / 1000
I was expecting the static functions to be faster. But I was wrong. They're much slower.
Local Functions using a Closure
// Local. Not using closure.
var f:Function = function(p:Point):Number
{
return p.x;
}
var p:Point = new Point(23.4, 56.7);
for (var i:Number = 0 ; i < 1000 ; i++){
var x:Number = f(p); // 14 msec / 1000
}
vs.
var p:Point = new Point(23.4, 56.7);
var f:Function =
function():Number { return p.x; }
for (var i:Number = 0 ; i < 1000 ; i++){
var x:Number = f(); // 25 msec / 1000
}
A "closure" is the local variable stack in the enclosing function. Somehow, a locally defined function can use this. But it's more expensive than simply passing the local variable as an argument.
Note: oddhammer.com has many more perfomance test results. The focus of this article and the previous article has been AS2 specific features.
Appendix
You can run the tests on your computer. This was built for Flash 7.

Here's the code being tested. Notice that each function has a line in the above Flash movie (assuming you ran the test).
import com.connectedpixel.apps.perftest.Point;
class com.connectedpixel.apps.perftest.FuncTypeCompare {
static public function setViaSetters():Void {
var p:Point = new Point();
for (var i:Number = 0 ; i < 1000 ; i++){
p.XVal = 23.4;
}
}
static public function setViaFunc():Void {
var p:Point = new Point();
for (var i:Number = 0 ; i < 1000 ; i++){
p.setX(23.4);
}
}
static public function setViaStatic():Void {
var p:Point = new Point();
for (var i:Number = 0 ; i < 1000 ; i++){
Point.staticSetX(p,23.4);
}
}
static public function setViaLocal():Void {
var f:Function =
function(p:Point,x1:Number):Void
{
p.x = x1;
}
var p:Point = new Point(23.4, 56.7);
for (var i:Number = 0 ; i < 1000 ; i++){
f(p,23.4);
}
}
static public function setViaLocalClosure():Void {
var p:Point = new Point(23.4, 56.7);
var f:Function = function(x1:Number):Void
{ p.x = x1; }
for (var i:Number = 0 ; i < 1000 ; i++){
f(23.4);
}
}
static public function getViaGetter():Void {
var p:Point = new Point();
p.x = 23.4;
for (var i:Number = 0 ; i < 1000 ; i++){
var x:Number = p.XVal;
}
}
static public function getViaFunc():Void {
var p:Point = new Point(23.4, 56.7);
for (var i:Number = 0 ; i < 1000 ; i++){
var x:Number = p.getX();
}
}
static public function getViaStatic():Void {
var p:Point = new Point(23.4, 56.7);
for (var i:Number = 0 ; i < 1000 ; i++){
var x:Number = Point.staticGetX(p);
}
}
static public function getViaLocal():Void {
var f:Function = function(p:Point):Number
{
return p.x;
}
var p:Point = new Point(23.4, 56.7);
for (var i:Number = 0 ; i < 1000 ; i++){
var x:Number = f(p);
}
}
static public function getViaLocalClosure():Void {
var p:Point = new Point(23.4, 56.7);
var f:Function =
function():Number { return p.x; }
for (var i:Number = 0 ; i < 1000 ; i++){
var x:Number = f();
}
}
}
Here's the Point class that's used in the above code.
class com.connectedpixel.apps.perftest.Point {
public var x:Number;
public var y:Number;
public function Point(x0:Number, y0:Number)
{
x = x0; y = y0;
}
public function set(x1:Number, y1:Number):Void
{
x = x1; y = y1;
}
public function set XVal(x1:Number):Void { x = x1; }
public function set YVal(y1:Number):Void { y = y1; }
public function get XVal():Number { return x; }
public function get YVal():Number { return y; }
public function getX():Number { return x; }
public function setX(x1:Number):Void { x = x1; }
static public function staticGetX(p:Point):Number
{
return p.x;
}
static public function staticSetX(p:Point,x1:Number):Void
{
p.x = x1;
}
}
