Производительность оператора в Flash / ActionScript 3? - PullRequest
3 голосов
/ 08 июля 2011

У кого-нибудь есть какие-нибудь статьи / тесты на производительность оператора?Я ничего не могу найти в Google, он просто ест мое ключевое слово "is" как слишком маленькое.

Я планирую широко использовать оператор is в системе обмена сообщениями для своих компонентов, поэтому производительность должна быть стабильной,Это избавит меня от необходимости придумывать схему идентификаторов и поисков идентификаторов для каждого сообщения, если я смогу просто выполнить:

function onMessage(message : Message, type : Class) : void
{
    switch(type)
    {
        case MessageOne:
            // whatever
        break;
        case MessageTwo:
            // whatever
        break;
    }
}

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

Кто-нибудь делал свои собственные тесты или знает некоторые статьи?

Спасибо.

Ответы [ 2 ]

9 голосов
/ 08 июля 2011

Оператор "is" очень быстрый, даже при десятках тысяч тестов в секунду.

Мало того, это действительно лучшая практика для сравнения иерархии наследования, а не только имени класса (например, сравнение, например, Image is UIComponent), а также поддержки реализации интерфейсов (например, сравнение Image is IEventDispatcher).

Подробнее: http://livedocs.adobe.com/flex/3/html/03_Language_and_Syntax_09.html#122921

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

:)

0 голосов
/ 23 июля 2011

Этот оператор is немного медленнее.
Мои тесты выглядели примерно так:

var obj:MyObj = new MyObj();

// Index type comparison
for(var a:int; a<1000000; a++){
    if(obj.type == OBJ_TYPE1) continue;
    if(obj.type == OBJ_TYPE2) continue;
    ...
}

// 'is' type comparison
var obj:MyObj = new MyObj();
for(var a:int; a<1000000; a++){
    if(obj is ObjectType1) continue;
    if(obj is ObjectType1) continue;
    ...
}

Я выполнил миллион итераций и за каждую итерацию выполнил 90 тестов (всего 9000 000 тестов).Результаты были следующими (в среднем по десяти тестам):

is operator                : 1974 ms
int static const compare   : 210.7 ms
int instance const compare : 97 ms
int literal compare        : 91.9 ms

Примечание о последних трех результатах теста на тот случай, если они недостаточно ясны: каждый из них по-прежнему выполняет целочисленное сравнение, но тестыразличаются способы хранения типов:

// For the second test the types are stored as static constants
// int static const compare  : 97.4 ms
private static const OBJ_TYPE1:int = 0;
private static const OBJ_TYPE2:int = 1;
...
// For the third test the types are stored as instance constants
// int member const compare  : 1319.9 ms
private const OBJ_TYPE1:int = 0;
private const OBJ_TYPE2:int = 1;
...
// Here the types are not stored anywhere but instead literals
// are used for each test
// int literal compare : 91.9 ms
for(var a:int; a<1000000; a++){
    if(obj.type == 0) continue; // OBJ_TYPE1
    if(obj.type == 1) continue; // OBJ_TYPE2
    ...
}

Таким образом, в целом целочисленные сравнения всегда быстрее, и если вы используете литеральные значения или переменные экземпляра, разница огромна (вы даже можете использовать здесь константы конфигурации, чтобы сохранить свой кодбез потери производительности при использовании переменных).

...