Как выяснилось, AS3 компилятор необычайно туп и не проводит никаких оптимизаций. Ну, может быть какие-то совсем простые.
Довелось мне посидеть оптимизировать небольшую библиотечку, на которой стоят все мои остальные. В ней происходит разбор XML, да через e4x, но все же разбор и создание некоторых объектов на основе этого XML. При этом, проходят некоторые проверки функциями isЧто-то(XML), которые представляют собой всего 1-3 строчки. Вызываются такие функции для каждого элемента, то есть часто.
А теперь смотрим тест.
var t: int;
var v: int = 5;
var w: int = 6;
for ( var i: int = 0; i < 5; i++ )
{
t = getTimer();
for ( var j: int = 0; j < 1000000; j++ )
{
var k: Boolean = func( v, w );
//var k: Boolean = v > w;
}
trace( getTimer() - t );
}
private function func( v: int, w: int ): Boolean
{
return v > w;
}
Выполняется у меня под 400ms.
Если раскомментировать вторую строку и закомментировать первую, то время падает до 90-100ms. В 4 раза. Полмиллисекунды тут, полмиллисекунды там и уже набираются десятки. Вспомним, что при 30fps на 1 кадры выделяется 33 миллисекунды. А ведь еще столько кода нужно выполнить.
Более того,
var t: int;
for ( var i: int = 0; i < 5; i++ )
{
t = getTimer();
for ( var j: int = 0; j < 1000000; j++ )
{
var k: int = value;
//var k: int = _value;
}
trace( getTimer() - t );
}
public function get value(): int
{
return _value;
}
та же фигня. Геттер по сути та же функция с теми же проблемами.
Я пошел и заменил все вызовы этих функций на сами функции. Любой программист знакомый с ООП сочтет меня дураком, потому что я копирую код. Пойдет на форум и напишет какой я тупой и не знаю ООП. Запихнет все эти скопированные куски в функции и будет горд собой. Вот он и вопрос. Скорость или ООП? По крайней мере пока компилятор остается таким говнистым, что сам не соображает как лучше сделать.







