2013-06-13 2 views
2

Considérez ces deux implémentations d'une fonction:arguments de fonction à l'aide directe vs Création de variables locales

double MyFoo::foo(std::vector<double> & v){ 
    double f1 = v.at(1); 
    double f2 = v.at(2); 
    double f3 = v.at(3); 
    double f4 = v.at(4); 
    double f5 = v.at(5); 
    double f6 = v.at(6);  

    double ret = sin(f1)+ sin(f2)+ sin(f3)+ sin(f4)+ sin(f5)+ sin(f6)+ sin(f7); 
    return ret; 
} 

et

double MyFoo::foo(std::vector<double> & v){ 
    double ret = sin(v.at(1))+ sin(v.at(2))+ sin(v.at(3))+ sin(v.at(4))+ sin(v.at(5))+ sin(v.at(6))+ sin(v.at(7)); 
    return ret; 
} 

Est-ce qu'il ya une différence notable (le cas échéant) le temps d'exécution de ces les fonctions? Est-ce que ces assignations de variables locales introduisent un surcoût de calcul ou les compilateurs traitent les variables locales inutiles?

P.S. Le choix de sin() est complètement arbitraire. Ma question est centrée sur les variables locales et non sur les opérations qui se déroulent à l'intérieur.

+0

Un bon compilateur/optimiseur entraînerait l'assemblage identique pour les deux scénarios. Je crois que le rationnel derrière l'optimisation serait que la valeur de la variable locale ne change pas. Comme l'a déclaré @Mats Persson, il s'agit au mieux d'une optimisation marginale, pour des valeurs aussi simples que des doubles, mais elle pourrait être significative pour des types de données plus gourmands en mémoire. – ChrisCM

Répondre

2

Sans la construction en fait un système qui fait cela, je dirais qu'il n'y a pas de différence. Et sin tend à prendre un certain temps de toute façon, il est donc probable que toute optimisation mineure faite sur l'utilisation des variables locales, etc est très marginal.

Je pense que la plupart des « bons » compilateurs (gcc, Microsoft, etc.) optimiseraient toute variable locale qui n'est pas largement utilisé, et produire exactement le même code. Mais comme je l'ai dit, sans vraiment essayer les deux méthodes, c'est difficile, alors disons à coup sûr [Et je retirerais l'appel à sin aussi, car cela pourrait "cacher" des différences mineures entre les deux variantes - juste ajouter les 6 valeurs doubles seraient une meilleure solution].

Si la performance (dans cette fonction en particulier) est d'essence alors produire une référence. Mais aussi, avant de commencer à "jouer" avec les fonctions, assurez-vous de savoir quelles fonctions consomment la plupart du temps dans votre code. Il est pas beaucoup d'intérêt à raser deux clockcycles hors fonction qui passe à quelques dizaines de fois, quand tout le temps d'exécution est plusieurs heures (tant de milliards de cycles).

+0

Merci pour votre réponse. Le choix de 'sin()' est complètement arbitraire et ma curiosité est sur autre chose. C'était juste la première chose qui me venait à l'esprit. Vous pouvez simplement considérer n'importe quelle autre fonction! – Pouya

+0

Oui, mon point est plutôt que si il faut un ou deux clockcycles pour "récupérer le' f1 = v.at (1) '", puis prend 200 clockcycles pour calculer 'sin (f1)', il peut être difficile de Dites la différence entre cela et le 'péché (v.at (1))'. Juste l'addition des nombres devrait être un ou quelques cycles d'horloge, ainsi devrait montrer une certaine différence - s'il y a une différence. –

Questions connexes