«Pas moins que» par rapport à la vitesse «plus grande ou égale à»
-
28-10-2019 - |
Question
Je me demandais si quelqu'un savait ou a un de ces tests de vitesse précis pour tester "pas moins" versus "plus ou égal à" la vitesse dans ActionScript 3 (AIR 2.5 si cela fait une différence)?
J'ai des machines virtuelles en cours d'exécution sur cet ordinateur et j'obtiens des résultats très inexacts.
L'utiliser comme tel
if ( !(__index < _vector.length) ) return;
ou
if ( __index >= _vector.length ) return;
J'aurais pensé que le premier, car tout ce qui fait est 1 test, puis le réinverser, mais ActionScript 3 a certaines de ces bizarreries où vous ne pouvez jamais être sûr.
La solution
Il ne devrait pas y avoir de différence de vitesse, en théorie. ActionScript utilise la bibliothèque Nanojit Jit pour compiler le code, et je sais pour un fait (ayant travaillé sur ce code auparavant dans le moteur JavaScript de Mozilla, qui partage Nanojit avec ActionScript d'Adobe) que le code pour implémenter les comparaisons transformera des conversions simples comme l'inversion d'une comparaison dans la comparaison inverse. Ainsi, en théorie, la seule différence est un autre cycle ou deux dépensé pour compiler le code. Cela ne vaut pas la peine de s'inquiéter.
D'un autre côté, les processeurs modernes sont des bêtes complexes et les perturbations infinitésimales peuvent faire des différences notables. Donc, même si je ne serais fortement pas en cours sur la différence entre les deux, je ne parierais pas la ferme dessus.
Autres conseils
Votre question concerne l'informatique plus que le script d'action spécifiquement car la plupart des langues tenteront de compiler le code machine le plus optimal possible.
Donc, j'utiliserai un exemple C ++ pour répondre à votre question.
int j = 16;
if (!(j < 10))
{
int l = 3;
}
if (j >= 10)
{
int l = 3;
}
Cela produit la section clé suivante dans l'assemblage:
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
Les lignes 00231375 et 00231382 sont vos tests réels contenus dans l'instruction IF. Comme vous pouvez le voir, mes tests <et> = ont été compilés comme le même code identique dans l'assemblage (lors de la comparaison de deux entiers). Par conséquent, l'un ou l'autre test prendra le même temps sur le CPU car ils aboutissent tous les deux au même test (s'ils sont à droite, sautez si le bloc). Ce sera très probablement le cas avec le compilateur de script d'action.
Cependant, une question pourrait être de savoir si le compilateur JIT prend plus de temps à compiler! ([Int] <[int]) ou [int]> = [int]. Je suppose que la différence ne suffit probablement pas à compter.
Faites une boucle et utilisez Gettimer () pour découvrir. Essayez quelque chose comme ceci:
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")
De plus, si vous obtenez des résultats inacultés avec cette tecnique, essayez d'agrandir la variable de comptage. La suppression de la vérification "_vector.leght" de la boucle peut être utile si vous avez juste besoin de vérifier les performances ">" et "> ="