L'ottimizzazione if-else in PHP ha qualche effetto?

3

Considera uno scenario, dove A si presenta frequentemente come 4 volte su 5, e B solo in rari casi, possiamo scrivere la nostra dichiarazione condizionale in due modi:

if(A) 
//do something
else
// do something if B, only rarely

O possiamo invertirlo

if(B)
//do something rarely
else
// do something with A frequently

So che nei linguaggi di basso livello l'ordine conta, specialmente con molte diramazioni, ma è qualcosa di simile anche se marginalmente vale in linguaggi come PHP ecc.?

    
posta The Law 21.11.2016 - 14:52
fonte

3 risposte

2

Questo non è pensato per essere un po 'obliquo su PHP, ma se sei preoccupato per la previsione del ramo statico in esso, qualcosa probabilmente è seriamente sbagliato. Anche il codice C più graffiante del metallo spesso non ne beneficia molto, se non del tutto, e le persone che si concentrano su quel genere di cose sono generalmente ingrandite al massimo livello micro analizzando il codice assembly e misurando ripetutamente con fantasia strumenti per guidare le loro decisioni. Non mi preoccuperei nemmeno se vuoi ottimizzare la micro-ottimizzazione. È un tipo di priorità più basso anche quando stai diventando davvero micro con le tue ottimizzazioni.

Concentrati prima di tutto sulla località di riferimento con i modelli di accesso alla memoria, se vuoi diventare micro. Ciò può apportare miglioramenti della velocità da 10x a 100x senza un miglioramento della complessità algoritmica. Non penso nemmeno che sia giusto chiamarli "micro" poiché qualcosa che migliora di 100 volte la velocità operativa di un utente è lontano dall'impatto "micro".

Ma previsione del ramo statico? Stai giocando a una lotteria con quella roba a meno che tu non sia un esperto completo quando si tratta di assemblare, creare profili e architettura del computer. Trovo spesso tentativi di programmazione per la previsione di diramazioni statiche anche in C con VTune in mano perché i percorsi più caldi abbiano effetti trascurabili, anche nei loop più stretti e, a volte, contro-intuitivamente, persino effetti negativi per ragioni che non ho competenze sufficienti per capire. Spero non ti dispiaccia, ma suppongo che anche tu manchi di tale competenza altrimenti questa domanda probabilmente non verrebbe sollevata, a quel punto ti suggerirei di concentrarti sul rendere il tuo codice facile da manipolare il più possibile senza preoccuparsi della previsione di diramazioni statiche in modo da poter dare la priorità alle grandi cose come miglioramenti algoritmici, schemi di accesso alla memoria e parallelismo.

    
risposta data 03.12.2017 - 20:48
fonte
1

Quando si tratta di micro-ottimizzazioni e lingue non compilate, non preoccuparti. La quantità di sovraccarico che viene aggiunta non utilizzando un programma compilato oscurerà qualsiasi tentativo di efficienza "di basso livello".

Tuttavia, nel contesto della tua domanda, ho trovato che "se" il caso più raro risulta essere un codice migliore. Ad esempio

/* Code that both cases share */
if(rare)
{
    // Code that only the rare case needs
}
/* Code that both cases share */

È molto più leggibile quindi

/* Code that both cases share */
if(common)
{
    // Code that only the common case uses
}
else
{
    // Code that 'anything else' would use
}
/* Code that both cases share */
    
risposta data 21.11.2016 - 17:28
fonte
-1

Per avviare questo tipo di micro-ottimizzazione in qualsiasi lingua probabilmente non ne vale la pena. Un confronto in BigO è O (1), non importa quale. Scrivi ciò che è leggibile.

Puoi facilmente eseguire alcuni benchmark di base per questo. Al momento non ho accesso a PHP ma ho creato i seguenti test per python (anche interpretato).

Loop 1000 volte che trova qualcosa nell'intervallo 1 - 100000 che è divisibile per 5000.

Prima non raro

import time
import statistics as s
if __name__ == '__main__':
    times = list()
    for on in range(1,1000):
        count = 0
        start_time = time.time()
        for n in range(1,100000):
            if(n%5000 != 0):
                count += 1;
            else:
                count -= 1

        times.append(time.time() - start_time)
    print(s.mean(times))

Primo caso raro

import time
import statistics as s
if __name__ == '__main__':
    times = list()
    for on in range(1,1000):
        count = 0
        start_time = time.time()
        for n in range(1,100000):
            if(n%5000 == 0):
                count += 1;
            else:
                count -= 1

        times.append(time.time() - start_time)
    print(s.mean(times))

Output relativi

not rare - 0.022764320488090628

rare - 0.02187611677267172

    
risposta data 20.01.2017 - 21:38
fonte

Leggi altre domande sui tag