J'étudie actuellement comment écrire du code C++ efficace, et à propos des appels de fonction, une question me vient à l'esprit. En comparant ce pseudo-code de fonction :
not-void function-name () {
do-something
return value;
}
int main () {
...
arg = function-name();
...
}
avec cette fonction pseudo-code identique :
void function-name (not-void& arg) {
do-something
arg = value;
}
int main () {
...
function-name(arg);
...
}
Quelle version est la plus efficace, et à quel égard (temps, mémoire, etc.) ? Si cela dépend, alors quand la première version serait-elle plus efficace et quand la seconde le serait-elle ?
Modifier : Pour le contexte, cette question se limite aux différences indépendantes de la plate-forme matérielle, et pour la plupart des logiciels également. Existe-t-il des différences de performances indépendantes de la machine ?
Modifier : Je ne vois pas en quoi il s'agit d'un doublon. L'autre question consiste à comparer le passage par référence (code précédent) au passage par valeur (ci-dessous) :
not-void function-name (not-void arg)
Ce qui n'est pas la même chose que ma question. Je ne cherche pas à savoir quelle est la meilleure façon de transmettre un argument à une fonction. Ma question est de savoir quelle est la meilleure façon de faire passer out un résultat à une variable de la portée extérieure.
12 votes
Pourquoi n'essayez-vous pas ? Cela dépend probablement de votre plate-forme et de votre compilateur. Faites-le un million de fois et profilez-le. De plus, en général, écrivez le code de la manière la plus claire possible et ne vous préoccupez des optimisations que si vous avez besoin d'augmenter les performances.
1 votes
Essayez les deux versions plusieurs millions de fois, tout en chronométrant les appels. Faites-le à la fois sans et avec les optimisations activées. En tenant compte des optimisations de la valeur de retour et de l'élision de la copie, je doute que vous trouviez de grandes différences dans les deux cas.
0 votes
Votre exemple ne fait même pas la même chose, et cela dépend fortement de la taille de l'argument, il est presque toujours plus efficace de passer par référence.
0 votes
Cela dépend du type et de la fonction. Vous ne pouvez pas faire de déclarations sur l'efficacité de bas niveau en vous basant sur un pseudo-code. Par défaut, je retournerais par valeur
0 votes
@xaxxon Je ne sais pas comment faire (je viens juste d'apprendre l'existence du profilage aujourd'hui lol).
0 votes
Alors la réponse à cette question n'a aucun sens pour vous. Il suffit d'écrire le code le plus simple possible.
3 votes
fr.wikipedia.org/wiki/Program_optimization#When_to_optimize
1 votes
@xaxxon Mon travail consiste à travailler avec du matériel avec des contraintes de ressources, et tout gain marginal de performance est critique dans cette industrie. Je dois au moins comprendre comment cela fonctionne, même si je n'ai pas l'occasion de l'essayer moi-même.
3 votes
@Pedro : Grâce à l'élision de copie et à la sémantique de déplacement, il y a beaucoup de cas où le passage / retour par valeur est en fait plus efficace.
0 votes
@thegreatjedi : Le problème est qu'il n'y a pas de réponse simple à cette question. Cela dépend de beaucoup de choses (OS, Processeur, compilateur, paramètres du compilateur, code appelant et appelé.... Si vous êtes préoccupé par un gain de performance de 5%, vous pouvez faire beaucoup d'hypothèses, mais à la fin, vous devez les vérifier pour le cas concret à portée de main.
0 votes
La question dont il est marqué comme duplicata concerne les arguments, pas les valeurs de retour.
1 votes
Les paramètres de sortie sont terribles de toute façon et cela n'a rien à voir avec les performances. Nous n'écrivons pas du code uniquement en fonction de sa rapidité d'exécution.
7 votes
Votre travail consiste à écrire du code et vous venez de découvrir le profilage ? Allez apprendre à profiler. Cela vous aidera beaucoup plus que tout ce qui est dit dans cette question. Et si vous êtes sur un matériel aussi contraint, alors sans information spécifique à ce périphérique, rien ici ne sera connu pour être vrai.
0 votes
@xaxxon Je ne dirai pas que le matériel avec lequel nous travaillons est limité en ressources au sens classique du terme. Mais tout gain de performance, aussi infime soit-il, donne un avantage pour la réussite de la mission.
1 votes
@thegreatjedi tout gain de performance, même infime, ne peut être que mesuré, pas deviné. Si vous vous intéressez à l'optimisation de bas niveau, vous devriez regarder l'assemblage généré par le compilateur en chaque et choisissez chaque affaire basée sur cela. Même si vous faites une expérience avec une fonction de test, cela ne peut pas être généralisé à tous les cas que vous avez dans votre application. Concentrez-vous sur une bonne conception et sur l'écriture d'un code lisible : dans votre cas, la fonction doit-elle être un constructeur de l'objet ?
0 votes
@xaxxon Je pense que de nombreuses questions posées ici peuvent tomber dans la catégorie "Pourquoi ne pas simplement essayer ?", mais ces questions méritent tout de même d'être postées car les réponses fournissent des références rapides examinées par de nombreux programmeurs professionnels. Si un test est vraiment nécessaire pour répondre à la question, il sera également très utile de fournir des codes de test. Ces codes de test, qui sont de plus en plus consultés, peuvent souvent être améliorés et devenir très sophistiqués.