"Non meno di" contro "maggiore o uguale a" velocità
-
28-10-2019 - |
Domanda
Mi chiedevo se qualcuno lo sapesse o ha uno di quei test di velocità accurati potrebbe testare "non meno di" contro "maggiore o uguale a" velocità in ActionScript 3 (Air 2.5 se ciò fa la differenza)?
Ho macchine virtuali in esecuzione su questo computer e ottengo risultati molto imprecisi.
Usandolo come tale
if ( !(__index < _vector.length) ) return;
o
if ( __index >= _vector.length ) return;
Avrei pensato al primo, dal momento che tutto ciò che sta facendo è 1 test e poi invertirlo, ma ActionScript 3 ha alcune di quelle stranezze in cui non si può mai essere sicuri.
Soluzione
Non dovrebbe esserci una differenza di velocità, in teoria. ActionScript utilizza la libreria Jit Nanojit per compilare il codice, e lo so per un dato nel confronto inverso. Quindi in teoria l'unica differenza è un altro ciclo o due spesi per compilare il codice. Questo non vale la pena preoccuparsi.
D'altra parte, le CPU moderne sono bestie complesse e le perturbazioni infinitesimali possono fare notevoli differenze. Quindi, mentre mettevo forti probabilità che non ci fosse alcuna differenza tra i due, non scommetterei la fattoria.
Altri suggerimenti
La tua domanda riguarda l'informatica più di quanto non fa lo script di azione in modo specifico poiché la maggior parte delle lingue tenterà di compilare il codice macchina più ottimale possibile.
Quindi, userò un esempio C ++ per rispondere alla tua domanda.
int j = 16;
if (!(j < 10))
{
int l = 3;
}
if (j >= 10)
{
int l = 3;
}
Questo produce la seguente sezione chiave in assemblaggio:
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
Le linee 00231375 e 00231382 sono i test effettivi contenuti nell'istruzione IF. Come puoi vedere, entrambi i miei test <e> = sono stati compilati come lo stesso codice identico nell'assembly (quando si confrontano due numeri interi). Pertanto, entrambi i test richiederà lo stesso tempo sulla CPU poiché entrambi si traducono nello stesso test (se a sinistra <a destra, salta se blocco). Questo sarà molto probabilmente il caso del compilatore di script di azione.
Tuttavia, una domanda potrebbe essere se il compilatore JIT impiega più tempo a compilare! ([Int] <[int]) o [int]> = [int]. La mia ipotesi è che la differenza probabilmente non è sufficiente da importare.
Fai un ciclo e usa getTimer () per scoprire. Prova qualcosa di simile:
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")
Inoltre, se ottieni risultati innacurati con questa tecnique, prova a rendere il conteggio variabile più grande. La rimozione della verifica "_vector.lenght" dal ciclo può essere utile se è necessario controllare le prestazioni ">" e "> ="