Quanto è veloce un costrutto "se" rispetto ad un'istruzione "se" immediata (IIF) e quando dovrei usarlo?

2

In che modo la tradizionale istruzione if si confronta con quella dell'istruzione immediato if (IIF, quella solitamente scritta come condition ? value_if_true : value_if_false ) in termini di velocità di esecuzione?

Inoltre, in quali scenari dovremmo utilizzare idealmente l'IIF?

    
posta Maxood 29.11.2011 - 08:25
fonte

4 risposte

5

MODIFICA: SBAGLIATO: molto probabilmente, non vi è alcuna differenza misurabile in termini di velocità.

CORREZIONE: Poiché IIf è una funzione di libreria in VB, vengono valutati sia truepart che falseepart, quindi se uno di questi è costoso da valutare ma alla fine non scelto, potrebbe essere molto più lento di un If convenzionale.

Pertanto, dovresti utilizzarlo quando rende il tuo codice più compatto e leggibile.

In molti casi, l'utilizzo di iif (o l'operatore ternario?: nelle lingue simili a C) rende possibile evitare l'introduzione di una variabile intermedia (o di una replica di codice)

Si consideri:

A = B + C + IIf(D<=3, D, 3)

vs.

If D<=3 Then
  E = D
Else
  E = 3
End If

A = B + C + E

o

If D<=3 Then
  A = B + C + D
Else
  A = B + C + 3
End If
    
risposta data 29.11.2011 - 08:44
fonte
4

Per quanto riguarda le prestazioni: in un linguaggio completamente compilato come C o C ++, con le ottimizzazioni attivate, la differenza è probabilmente zero. In altri linguaggi (interpretati, byte-code-compilati, o jit-compilati) ci può essere una differenza, ma 1. non sarà molto e 2. non sarà il collo di bottiglia. Ci sono delle eccezioni, ma quelle sono rare, e se ne incontrate una, probabilmente state armeggiando con profiling a grana fine e ottimizzazioni a livello di istruzioni; in tutti gli altri casi, sarà abbastanza veloce.

Pertanto, come sempre, la prima scelta dovrebbe essere ottimizzare la leggibilità, non le prestazioni di runtime . Il che ci porta alla domanda quando dovresti usare l'una o l'altra; bene, le opinioni divergono. Un campo dice che l'operatore ternario semplicemente non dovrebbe essere usato affatto, per carità; e hanno certamente un punto, perché ha la tendenza a creare one-liner davvero complicati, specialmente se lo annidate, ma anche perché la sua precedenza può portare a risultati indesiderati. Tuttavia, penso che ci siano situazioni in cui un operatore ternario rende il codice più leggibile, e non vedo nulla di sbagliato nell'usarlo in una tale situazione; un esempio da manuale è un testo semplice che pluralizza:

printf("%i %s deleted.", num_files, (num_files > 1) ? "files" : "file");

Lo stesso codice scritto con un'istruzione esplicita if avrebbe preso 5 righe aggiuntive senza contribuire in modo sostanziale alla leggibilità.

Detto questo, IIf in VB ha un avvertimento sgradevole: a differenza di If , che è un'istruzione linguistica corretta e valuta solo un ramo, IIf è una funzione built-in, quindi entrambi i rami vengono valutati, no importa quello che dice la condizione. Fintanto che i rami non hanno effetti collaterali, non te ne accorgi, ma quando lo fanno, ti viene in mente un serio face-palming.

    
risposta data 29.11.2011 - 11:08
fonte
2

La risposta di ammoQ ha bisogno di chiarimenti, vuol dire che il programmatore non lo fa t dobbiamo intodurre una variabile temporanea, non il compilatore . In tutti i casi ci sarà una variabile temporanea per contenere il risultato dell'operatore condizionale.

La vera differenza che conosco (almeno in C, C ++ e Java) è che si tratta di un'espressione , al contrario di una istruzione . In altre parole, può agire come RValue (intendo un valore che può essere assegnato a una variabile). Una dichiarazione non valuta un valore. Ciò rende il loro utilizzo più conveniente, come ad esempio:

int x = (y > 0 ? 1 : 2);

che non può essere scritto come

int x = if (y > 0) 1; else 2;

Ma piuttosto diviso in più di una riga. Ciò sarà evidente quando la logica all'interno di if / else aumenta.

    
risposta data 29.11.2011 - 09:14
fonte
2

Micro-ottimizzazione raramente vale la pena di preoccuparsi e se l'operatore remoto viene eseguito più velocemente di un condizionale completo che rientra sicuramente nella categoria di micro-ottimizzazione .

In realtà, l' operatore ternario dovrebbe essere usato quando rende il codice più chiaro da leggere e quindi più facile da mantenere e dovrebbe essere evitato laddove rende l'intento del codice più oscuro e quindi più difficile da mantenere.

Se si arriva allo stadio in cui l'applicazione non funziona come necessario, è necessario profilare la propria applicazione, confrontandola con carichi applicativi tipici e peggiori. Solo allora puoi vedere dove l'applicazione è in esecuzione troppo lentamente e quindi dove passare il tempo a ottimizzare.

Così com'è, è improbabile che tu veda alcuna differenza tra il codice con IIf di usi e il codice che non lo fa, ma per essere sicuro che devi fare un benchmark.

Infine, devi essere molto attento all'uso del costrutto VB IIf() a causa di problemi con effetti collaterali . Il fatto che value_if_true e value_if_false siano sempre valutati , indipendentemente dal valore della condizione significa che la versione IIf() potrebbe comportarsi molto in modo diverso rispetto alla% normaleIf costrutto che potrebbe essere inteso per sostituire.

    
risposta data 29.11.2011 - 17:35
fonte

Leggi altre domande sui tag