2016-05-06 3 views
0

Disons qu'il y a une fonction que j'ai besoin d'appeler des millions de fois. Les opérations arithmétiques effectuées par cette fonction ne sont pas si lourdes, donc la seule chose qui compte est la rapidité avec laquelle toutes les variables sont allouées. Nous supposons également que la variable est toujours allouée sur la pile. L'exemple de cas le plus simple:Optimisation de la fonction fréquemment appelée avec de grandes variables locales (C++)

void doSomething(){ 
    int aReallyLargeVariable[10000]; 
    ...performing a few light operations on that variable and returning nothing... 
} 

Je sais que lorsque la fonction retourne toutes ses variables sont détruites, alors
serait-il pas mieux en le rendant statique ou global pour mettre en cache cette variable? Quel serait le meilleur moyen de l'optimiser?

+1

Faire de la variable un paramètre de la fonction et utiliser la même variable pour de nombreux appels de fonction? – rozina

+0

La fonction est appelée récursivement ou simultanément? –

+1

Et - puisque vous êtes déjà au courant des conceptions alternatives, pouvez-vous partager vos résultats de référence sur les comparaisons que vous avez sûrement déjà exécuté? –

Répondre

3

Ce n'est pas l'allocation qui causera un problème de performance. Le problème est d'initialiser alors quand

int aReallyLargeVariable[10000]; 

ne prendra pas beaucoup de temps le

int aReallyLargeVariable[10000] = {0}; 

fera. La création dynamique d'objets volumineux peut également causer un problème.

Si vous avez une fonction qui n'a pas une logique très lourde et n'utilise que des types primitifs, définissez-la simplement comme inline et ne vous souciez pas des performances.

Si vous devez définir grande quantité d'objet penser à une autre structure de données comme stack ou vector qui pas besoin d'avoir 1000 ou plusieurs éléments

1

Pour optimiser cette fonction, étant donné que c'est appelé à plusieurs reprises, la la première étape devrait être do not declare the large variable locally. Lorsque vous faites cela, quelques événements se produisent:

  • Beaucoup d'espace de pile est gaspillé, puisque vous avez déclaré le tableau localement et n'utilisez probablement que quelques valeurs.
  • Les opérations de pile (push/pop) provoquées par cette déclaration l'emportent probablement sur le travail réel que la fonction doit effectuer.

Il est préférable de déclarer ce tableau ailleurs (le déclarer globalement si nécessaire) et de passer un pointeur sur le tableau. De cette façon, vous pouvez également réutiliser la mémoire et ne pas perdre de temps à réaffecter.

+0

Comme le dit m.antkowicz, le temps nécessaire pour les opérations de pile (push/pop) n'est pas affecté par la taille des variables locales; ces opérations modifient simplement une valeur de registre. –