Tag Archive for 'e4x'

Скорость vs OOP

Как выяснилось, 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;
}

та же фигня. Геттер по сути та же функция с теми же проблемами.

Я пошел и заменил все вызовы этих функций на сами функции. Любой программист знакомый с ООП сочтет меня дураком, потому что я копирую код. Пойдет на форум и напишет какой я тупой и не знаю ООП. Запихнет все эти скопированные куски в функции и будет горд собой. Вот он и вопрос. Скорость или ООП? По крайней мере пока компилятор остается таким говнистым, что сам не соображает как лучше сделать.