Esiste una differenza di prestazioni tra ++ x su x ++? [duplicare]

1

Esiste una differenza di rendimento tra l'utilizzo di ++x rispetto a x++ degli operatori di incremento?

Ho visto che gli sviluppatori usano ++x nei cicli in cui normalmente scrivere x++ per abitudine.

Ad esempio;

 for(int x=0; x < 10; ++x)

Non ci sarebbero differenze nei risultati tra ++x o x++ . Quindi mi chiedo se c'è un motivo per cui alcune persone lo fanno in questo modo.

Ora so che l'operatore di incremento viene gestito internamente in modo diverso a seconda della lingua. Quindi, se c'è una differenza di prestazioni per PHP, Java, C #, C ++ o JavaScript. Mi piacerebbe sapere quale lingua.

    
posta cgTag 24.04.2014 - 12:47
fonte

3 risposte

8

Per numeri interi semplici; NO , qualsiasi ottimizzatore di spioncino decente vedrà il valore non utilizzato e utilizzerà l'opzione migliore disponibile.

Per tipi più complessi (sovraccarichi) in C ++ (come gli iteratori); eventualmente, l'incremento pre e post si espande a diversi metodi che possono essere completamente diversi. In genere l'incremento del post è necessario creare una copia di se stesso prima di incrementare.

    
risposta data 24.04.2014 - 12:52
fonte
4

In termini di valutazione logica del ciclo, ovviamente non c'è alcuna differenza, quindi la domanda è: puoi compilare ++x in qualcosa di più efficiente di x++ ?

E sì, davvero puoi se guardi abbastanza da vicino. Per eseguire l'incremento sulla variabile, è necessario caricare il suo valore nello stack (o in un registro o ovunque, per semplicità, continuerò a dire stack), quindi eseguire l'operazione di incremento. Il tuo stack conterrà quindi il valore incrementato in alto. È lo stesso per entrambi i modi, quindi perché c'è una differenza?

Fa la differenza, una volta che inizi a usare queste espressioni in quelle più grandi. Considera f(++x) e f(x++) . Per creare il codice che esegue la chiamata di funzione, è necessario posizionare il suo argomento sullo stack. Ora se l'argomento è x++ , allora si posiziona x sullo stack e si chiama il metodo, che rimuove nuovamente gli argomenti dallo stack. Il problema è che dopo tutto questo, è necessario caricare nuovamente x nello stack per eseguire l'operazione di incremento.

Detto questo: mentre si usa ++x potrebbe darti alcuni cicli di prestazioni della CPU, questo non è assolutamente il tipo di differenza di prestazioni che dovresti avere sul tuo radar.

Inoltre, come sottolineato da Ratchet Freak, l'operazione ++ stessa può essere sovraccaricata in alcune lingue, risultando in comportamenti molto più complessi e persino in risultati diversi. Tuttavia, in questi casi, considero un atto criminale integrare queste operazioni (o in caso di risultati diversi per definirle come tali). E una volta che consideri l'istruzione x++ o ++x in isolamento, non c'è nulla di interessante da dire sulle prestazioni in ogni caso.

    
risposta data 24.04.2014 - 13:01
fonte
3

No, non esiste alcuna differenza di prestazioni coerente tra questi operatori che è valida per un intervallo di lingue.

In molte lingue mi aspetterei che si comportassero in modo identico, fino al punto di generare codice identico. Il motivo è che ognuno produce il risultato identico e, a condizione che lo scrittore del compilatore sia sul posto di lavoro, è relativamente possibile eseguire l'ottimizzazione dello spioncino su questo caso senza il rischio di effetti collaterali indesiderati. Non c'è alcun motivo per cui una di esse sia più lenta, se lo scrittore del compilatore è all'altezza.

Detto questo, alcuni di questi linguaggi vengono compilati con codice intermedio ed è possibile che i due costrutti abbiano come bersaglio un codice intermedio diverso. In questo caso ci potrebbe essere una piccola differenza nelle prestazioni, ma non sarebbe facile prevedere quale sia più veloce.

Se ti interessa davvero, dovrai confrontare ogni costrutto su ciascuna lingua di destinazione. Anche se trovi che c'è una differenza, ti suggerisco di ignorarla e di scrivere semplicemente il codice che sembra naturale e sembra giusto. Qualsiasi differenza di prestazioni sarà infinitesimale.

    
risposta data 24.04.2014 - 13:01
fonte

Leggi altre domande sui tag