Этот оператор 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
...
}
Таким образом, в целом целочисленные сравнения всегда быстрее, и если вы используете литеральные значения или переменные экземпляра, разница огромна (вы даже можете использовать здесь константы конфигурации, чтобы сохранить свой кодбез потери производительности при использовании переменных).