"не меньше, чем" против "больше или равно" скорости " - PullRequest
0 голосов
/ 04 февраля 2011

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

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

Используя это как таковое

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

или

if ( __index >= _vector.length ) return;

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

Ответы [ 3 ]

2 голосов
/ 04 февраля 2011

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

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

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

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

0 голосов
/ 07 февраля 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" из цикла может быть полезно, если вам просто нужно проверить производительность ">" и "> ="

...