Cout de variables globales dans un namespace
Bonjour!
J'ai une question qui concerne plus ou moins de l'optimization, mais aussi la façon dont un compilo gère les namespaces et plus précisément les variables globales "enfermées" dans des namespaces.
Dans le document suivant consacré à l'optimization en C++, on peut lire à la page 24 :
Citation:
The advantage of static data is that they can be initialized to desired values before the
program starts. The disadvantage is that the memory space is occupied throughout the
whole program execution, even if the variable is only used in a small part of the program.
This makes data caching less efficient.
Do not make variables global if you can avoid it. Global variables may be needed for
communication between different threads, but that’s about the only situation where they are
unavoidable. It may be useful to make a variable global if it is accessed by several different
functions and you want to avoid the overhead of transferring the variable as function
parameter. But it may be a better solution to make the functions that access the saved
variable members of the same class and store the shared variable inside the class. Which
solution you prefer is a matter of programming style.
Source : http://www.agner.org/optimize/ le premier PDF.
Vu le conseil donné ici de complètement éviter les variables globales (non constantes), je me demandais si le fait de les encapsuler dans des espaces de nom n'aidait pas à indiquer au compilo de ne pas charger en permanence les dites variables (a ce que j'ai compris). Ou bien les espaces de noms sont-ils uniquement gérés comme des extension des noms des variables?
Je me demandais ça parceque la configuration (provenant d'un .ini) de mon application est actuellement reflétée par des variables globales (les seules de l'application si on omet les membres statiques de classes) qui peuvent potentiellement être modifées par pas mal de code différent, donc ça me semblait plus naturel de simplement les encapsuler dans un namespace plutot que de faire une classe avec uniquement des membres statiques (vu que je ne veux pas d'instanciation). (note : ce ne sont que des types de bases ou des std::string)
Je me demande aussi si ça vaut vraiment le coup de se poser la question : est-ce que ça peut vraiment plomber des perfs globales a cause de l'impact sur la stack ou est-ce que c'est tellement mineur que je peux oublier jusqu'à ce que ça pose de manière évidente un problème de perf?
Tirer profit de l'architecture du CPU.
Bonsoir,
Les recommandations faites ou les points à surveiller dans les développements me semblent raisonnables et sa lecture est intéressante.
1 - Il préfére une allocation dans la pile d'exécution plutôt que des accès aux variables globales parce que le haut de la pile sera probablement dans le cache L1 du CPU.
2 - Les appels de fonctions DLL signfie une indirection via la table des vecteurs qui décrit les points d'entrées de la DLL. Ca fait deux acces mémoires de trop. Il préfère les libraries statiques: ca fait du code plus compact.
3 - Les DLLs sont mappés sur des frontières de pages. Ca peut faire des collisions dans le cache L2. Si on doit passer par des DLLs, préférer de grosses DLL à plein de petites.
Ceci dit, comme toutes optimisations est ce que çà va apporter plus de performances (suivant le soft bien sûr, mais est ce que c'est important pour des softs lambda?) à condition de ne pas trop sacrifier à la maintenabilité et aux coûts de développements.
=> Sans oublier qu'on tirera plus de performance d'un CPU en évitant de... cela reste à arbitrer avec d'autres aspects qui ne sont pas toujours compatibles.
- W