Efficacité de l’appel de registre par rapport aux options utilisateur stockées dans une variable statique

J’ai un programme qui stocke certaines options utilisateur dans le registre (environ 5 options). Les options sont extraites du registre dans une fonction inline. Les options doivent être vérifiées plusieurs fois pendant l’exécution. Plus précisément, les options sont vérifiées dans une fonction pouvant être appelée plus de 100 fois au cours d’une routine.

Ma question est la suivante: 1) Appelez la fonction inline qui obtient l’option du registre à chaque fois que l’option doit être cochée; ou 2) Appelez la fonction inline une fois, puis stockez le résultat dans une variable statique, qui sera ensuite utilisée pour vérifier l’option.

Veuillez noter que je ne suis pas concerné par les options modifiées pendant l’exécution car elles sont rarement modifiées et n’ont pas besoin de prendre effet avant la prochaine exécution du programme.

Tout commentaire serait très apprécié.

Du sharepoint vue des performances théoriques, il semble évident que les variables en cache seront plus efficaces que les access répétés au registre (qui impliquent des appels système et peut-être même des entrées / sorties de disque). Mais comme le note @MarkRansom dans les commentaires, il est peu probable que 100 access au registre aient une grande influence sur les performances de votre programme, sauf si votre routine est appelée très souvent (par exemple, dans une boucle serrée).

Comme d’habitude avec tout problème de performance / optimisation: vous ne devriez pas vous embêter à moins de savoir que cela pose un problème de performance (par exemple, votre profileur vous le dit ou vous pouvez facilement le prouver vous-même).


Cependant, il y a un autre problème à résoudre.

Vous dites ” Je ne suis pas concerné par les options changées pendant l’exécution ” mais à mon humble avis vous devriez: que se passe-t-il si l’utilisateur modifie une option pendant l’exécution de votre programme? Je veux dire, vous avez commencé un calcul basé sur des options spécifiques qui induisent des hypothèses spécifiques, et soudainement, l’option change. Cela pourrait facilement perturber vos invariants / hypothèses et introduire des problèmes de cohérence.

Ainsi, indépendamment des problèmes de performances, vous devez toujours mettre en cache vos parameters définis par l’utilisateur dans les variables afin que, s’ils sont modifiés par l’utilisateur lors de l’exécution, votre programme rest cohérent.

En d’autres termes, pour moi, ce n’est pas tant une question de performance que de correction du programme .

@CaptainObvlious soulève un point intéressant: si vous avez réellement besoin de mettre à jour vos parameters lorsque l’utilisateur (ou une autre application) les modifie, faites-le de manière contrôlée (comme il le suggère, surveillez le registre) et mettez à jour vos variables seulement quand c’est approprié pour le faire. Cela garantit que vos parameters ne changeront pas en cours de calcul lorsque ce calcul attend les mêmes parameters.

Votre meilleure option va mettre en cache les parameters dans les variables. Lorsque vous lisez la valeur, vous obtenez une instruction de chargement (unique) vs l’appel d’une API système qui peut effectuer des E / S de fichiers ou d’autres tâches chronophages pour récupérer la valeur. Si vous avez besoin de gérer les parameters mis à jour par des applications externes, vous pouvez toujours surveiller les modifications du registre , ce qui peut nécessiter des verrous supplémentaires pour un access multithread. Même dans ce cas, les performances restront nettement supérieures à la lecture du registre.

[Voir la réponse de syam pour certaines considérations sur la correction du programme. C’est quelque chose que vous devez garder à l’esprit pour les parameters multiples qui affectent les uns les autres.]