Quale di questi è più efficiente in ColdFusion?ColdFusion: structKeyExists() più efficiente invece di isDefined()
isDefined('url.myvar')
o
structKeyExists(url, 'myvar')
Quale di questi è più efficiente in ColdFusion?ColdFusion: structKeyExists() più efficiente invece di isDefined()
isDefined('url.myvar')
o
structKeyExists(url, 'myvar')
In questi giorni (CF8 +) la differenza di velocità non è che grande. Tuttavia, structKeyExists
è effettivamente un po 'più veloce. Ecco perché.
Quando si utilizza isDefined
, la stringa passata viene cercata come nome chiave in diversi ambiti. A partire dal CF9, l'elenco degli ambiti, nell'ordine controllato è: (source)
Anche se si utilizza il nome di ambito con isDefined
(come: if isDefined('variables.foo')
) l'elenco sarà ancora essere verificata in ordine; e se la variabile local.variables.foo
è definita, sarà trovata PRIMAvariables.foo
.
D'altra parte, structKeyExists
cerca solo la struttura passata per l'esistenza del nome della chiave; quindi ci sono molti meno posti che dovrà guardare.
Utilizzando codice più esplicito (structKeyExists
), non solo si ottiene un po 'di prestazioni, ma il codice è più leggibile e gestibile, a mio parere.
Utilizzare quello che è più facile da leggere e mostra meglio quello che stai facendo.
La differenza tra i due è incredibilmente piccola, e molto probabilmente non vale la pena preoccuparsi affatto.
non perdere tempo ottimizzando il codice a meno che non si dispone di una provata e ripetibile banco di prova che dimostra la lentezza.
+1. Vale sicuramente la pena di capire * come * funzionano le due funzioni. Ma a meno che non si abbia un problema di prestazioni , scrivere codice leggibile che si comporta correttamente è molto più importante IMO. – Leigh
Sono completamente d'accordo, ma sono ancora un utente regolare di 'structKeyExists'. Trovo che la sua natura esplicita renda tutto cristallino, dove 'isDefined' non sempre, il che comporta più tempo e grattacapi quando si ritorna al vecchio codice (e/o al codice di qualcun altro) mesi o anni dopo. –
Sebbene IsDefined() sia più intuitivamente denominato, ciò che hai appena descritto è ancora un motivo migliore per scegliere l'uno rispetto all'altro, piuttosto che preoccupazioni premature sulle prestazioni. Almeno IMHO ;-) - Leigh 8 minuti fa – Leigh
Molto buono! È interessante vedere come elabora le funzioni in modo diverso. –
Penso anche che ColdFusion debba eseguire una valutazione sulla stringa fornita. StructKeyExists evita molto lavoro. –
C'è un grosso problema con 'structKeyExists()'.Se si deserializza una stringa JSON con ColdFusion e si ha una proprietà 'myVal' con il valore' null', quindi 'structKeyExists (object," myVal ")' restituirà 'true', mentre' isDefined ("object.myVal") 'non lo farò. In altre parole, se provi ad accedere alla proprietà con 'object.myVal' dopo aver controllato con' structKeyExists() ', avrai un errore. – android