2011-12-07 22 views
5

Attualmente sto facendo un gioco per iPad e iPhone usando cocos2d, Box2D e Objective-C.Qualunque guadagno/perdita di prestazioni con più chiamate di funzione piuttosto che una singola grande?

Un sacco di cose sta accadendo ogni aggiornamento, e molto deve essere risolto.

Recentemente ho rifattorizzato molto del mio codice in molti piccoli metodi, invece di avere centinaia di righe di codice all'interno dello stesso metodo.

C'è qualche perdita di prestazioni facendo questo? Un numero inferiore di chiamate di metodo aumenta le prestazioni?

+0

Come hai fatto il refactoring - cosa ti dice il tuo tempismo? – Mark

+0

Vedere il mio post delle prestazioni per apprendere quanto un messaggio Objective-C invia i costi e in che modo si confronta con altre attività: http://www.learn-cocos2d.com/2011/11/depth-ios-cocos2d -performance-analysis-test-project/ – LearnCocos2D

+0

Se ti preoccupi del numero di chiamate al metodo piuttosto che delle dimensioni delle tue trame e cose del genere, penso che tu sia in una buona posizione :) –

risposta

9

Ogni chiamata di funzione ha come risultato un ritardo costante (O(1)) a causa delle regolazioni del frame dello stack e della ramificazione. Tuttavia, non riterrete quel ritardo a meno che le chiamate non siano fatte all'interno di un ciclo di tempo critico un milione di volte.

L'approccio migliore sarebbe, penso, scrivendo il codice più pulito possibile e quindi ottimizzandolo - con l'aiuto di un profiler - se necessario.

Si potrebbe anche voler dare un'occhiata a questa risposta: https://stackoverflow.com/a/4816703/252687 Le funzioni inline possono ridurre un po 'l'overhead sopracitato senza compromettere la modularità.

+0

+1 una volta che ho fatto un simulatore del lotto che girava milioni di volte e lo codificavo una volta chiamando diversi metodi nel ciclo e altre volte come un grande blocco di codice. L'unico grande blocco di codice si è rivelato più veloce, quindi questo "Tuttavia, non sentirai quel ritardo a meno che le chiamate non vengano fatte all'interno di un loop critico per il tempo un milione di volte." è perfetto. :) – Ricky

3

Ovviamente c'è un calo delle prestazioni con più chiamate di metodo. Tuttavia, non è una ragione per usarne di meno, si tratterebbe di un'ottimizzazione pre-matura a scapito di un codice più pulito.

Personalmente scelgo il codice più chiaro, il compilatore ottimizzato e nel profilo finale i veri colli di bottiglia.


Una volta sono stato assunto sulla base di una risposta a una domanda singola, che era il profilo prima di ottimizzare. :-)

3

Ho visto casi in cui più funzioni più piccole hanno prodotto un codice significativamente migliore, poiché il compilatore era in grado di ottimizzare i registri. Molto dipendente dal compilatore e dallo stile di programmazione, però.

Ma in generale, su sistemi moderni (diversi dai microprocessori veramente di basso livello) l'ottimizzazione delle prestazioni a questo livello è controproducente. È meglio strutturare bene il codice (che in genere implica un discreto numero di subroutine) in modo che sia più affidabile, più facile da mantenere e più facile da individuare e correggere più problemi di prestazioni globali.

2

Dopo che il compilatore ha ottimizzato il codice, probabilmente non si noterà alcuna differenza di prestazioni affidabile, a meno che non si stia tentando di utilizzare le immissioni di metodo all'interno dei loop interni di una routine di calcolo intensiva della CPU, come DSP o elaborazione dell'immagine a livello di pixel.

Problemi correlati