не менее против большей или равной скорости

Мне было интересно, знает ли кто-нибудь или у кого-нибудь есть один из этих точных тестов скорости, который может проверить «не меньше чем» против «больше или равно» скорости в Actionscript 3 (Air 2.5, если это имеет значение)?

У меня есть виртуальные машины, работающие на этом компьютере, и я получаю очень неточные результаты.

Использование его как такового

if ( !(__index < _vector.length) ) return;

or

if ( __index >= _vector.length ) return;

Я бы подумал, что первый, поскольку все, что он делает, - это 1 тест, а затем его реверсирование, но у actionscript 3 есть некоторые из тех причуд, в которых вы никогда не можете быть уверены.


person WORMSS    schedule 04.02.2011    source источник


Ответы (3)


Теоретически разницы в скорости быть не должно. ActionScript использует JIT-библиотеку nanojit для компиляции кода, и я точно знаю (работая над этим кодом ранее в движке Mozilla JavaScript, который разделяет nanojit с Adobe ActionScript), что код для реализации сравнений преобразует простые преобразования, такие как инверсия сравнения. в обратное сравнение. Таким образом, теоретически единственная разница заключается в том, что на компиляцию кода затрачивается один или два цикла. Об этом не стоит беспокоиться.

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

person Jeff Walden    schedule 04.02.2011
comment
Спасибо, время компиляции не проблема. Просто выполнение кода. - person WORMSS; 04.02.2011

Ваш вопрос больше касается информатики, чем сценария действий, поскольку большинство языков будут пытаться скомпилировать максимально оптимальный машинный код.

Итак, я буду использовать пример C++, чтобы ответить на ваш вопрос.

int j = 16;
if (!(j < 10))
{
    int l = 3;
}

if (j >= 10)
{
    int l = 3;
}

Это производит следующий ключевой раздел в сборке:

00231375  cmp         dword ptr [j],0Ah  
00231379  jl          wmain+32h (231382h)  
0023137B  mov         dword ptr [l],3  
00231382  cmp         dword ptr [j],0Ah  
00231386  jl          wmain+3Fh (23138Fh)  
00231388  mov         dword ptr [l],3  
0023138F  xor         eax,eax  

Строки 00231375 и 00231382 — это ваши фактические тесты, содержащиеся в операторе if. Как видите, оба моих теста ‹ и >= были скомпилированы как один и тот же идентичный код на ассемблере (при сравнении двух целых чисел). Следовательно, любой тест займет одинаковое количество времени на ЦП, так как они оба приводят к одному и тому же тесту (если слева ‹ справа, пропустить, если блок). Это, скорее всего, будет иметь место с компилятором сценариев действий.

Однако один вопрос может заключаться в том, что JIT-компилятору требуется больше времени для компиляции !([int] ‹ [int]) или [int] >= [int]. Я предполагаю, что разницы, вероятно, недостаточно, чтобы иметь значение.

person regex    schedule 04.02.2011
comment
Спасибо, время компиляции не проблема. Просто выполнение кода. - person WORMSS; 04.02.2011

сделайте цикл и используйте getTimer() для обнаружения. Попробуйте что-то вроде этого:

var startTime:int = getTimer()
var count:int = 1000000
for (var i:int = 0;i<count;i++) {

    if ( !(__index < _vector.length) ){

    }
}
trace("The first script took "+String(getTimer()-startTime) + "ms to run")



startTime = getTimer()
for (i = 0;i<count;i++) {

    if ( __index <= _vector.length ){

    }
}
trace("The second script took "+String(getTimer()-startTime) + "ms to run")

Кроме того, если вы получаете неточные результаты с помощью этой техники, попробуйте увеличить переменную count. Удаление проверки "_vector.lenght" из цикла может быть полезно, если вам просто нужно проверить производительность ">" и ">="

person Lucas Speranza    schedule 07.02.2011
comment
Да, я знаю, как это сделать. Если вы прочитаете мой вопрос еще раз, вы поймете, почему я попросил других сделать это из-за виртуальных машин. - person WORMSS; 23.11.2012