J'utilise (dans matlab) A L'analyseur de code avertit moi que " Qu'est-ce que cet avertissement signifie vraiment est " L'avertissement est correct; MATLAB utilise un mécanisme de chargement variable vraiment inhabituel à l'arrière-plan. Il est donc vraiment beaucoup plus lent d'importer des variables globales à l'intérieur d'une instruction IF. Dans ce cas, j'aimerais avoir un indice ou un pointeur sur la façon dont ces choses fonctionnent vraiment, car je suis intéressé et il semble être important si je veux écrire un code efficace à l'avenir. P> Li>
ol> Laquelle de ces deux explications est correcte? (Ou peut-être ni n'est ni?) p> Merci d'avance. p> EDIT: Pour que ce soit plus clair: je sais que mais pas sur p> Je trouve difficile de Imaginez une raison pour laquelle la première devrait être plus lente que la seconde. p> p> instruction globale code> à l'intérieur d'une commande IF, afin d'importer la variable globale dans l'espace de noms local uniquement s'il est vraiment nécessaire.
global code> pourrait être très inefficace, sauf s'il s'agit d'une instruction de niveau supérieur dans sa fonction". Penser à une éventuelle mise en œuvre interne, je trouve cette restriction très étrange et inhabituelle. Je pense à deux possibilités: p>
global code> est très inefficace de son propre, donc ne l'utilise pas dans une boucle". En particulier, l'utiliser à l'intérieur d'une si, comme je le fais que je fais, est parfaitement sûr et l'avertissement est émis à tort (et mal formulé) p> li>
global code> est lent (et apparemment je peux 't Évitez de l'utiliser, car il s'agit d'une décision de conception d'une vieille bibliothèque que j'utilise); ce que je demande, c'est pourquoi l'analyseur de code MATLAB se plaint de p>
4 Réponses :
Je ne connais pas la réponse, mais je soupçonne fortement que cela a trait à la manière dont la mémoire est allouée et partagée au moment de l'exécution. P>
Quoi qu'il en soit, je vous recommande de lire les deux entrées suivantes sur le blogs mathrocks par loren et Doug : p>
Longue histoire courte, les variables globales ne sont presque jamais la voie à suivre; Il existe de nombreuses autres façons d'accomplir un partage variaable - dont certaines en discute - qui sont plus efficaces et moins sujettes à une erreur. P>
Merci de partage, mais les variables mondiales sont un choix de la bibliothèque que j'utilise (Lyapack), donc je ne peux donc pas le changer.
@Jonas - Vous savez, je n'ai jamais pris la peine de regarder cette image sur la barre latérale de son blog. Merci d'avoir fait remarquer cela.
Supplément Eykanals Post, Cette Note technique donne une explication à laquelle global em> est lent. p>
... Lorsqu'un appel de la fonction implique des variables globales, la performance est encore plus inhibée. Cela est dû au fait de rechercher des variables globales, Matlab doit élargir son espace de recherche à l'extérieur de l'espace de travail actuel. En outre, la raison pour laquelle un appel de fonction impliquant des variables globales semble beaucoup plus lentement que les autres sont que Matlab Accelerator n'oblise pas un tel appel de fonction. P>
blockQuote>
Intéressant (et ce serait encore plus s'il comprenait des poignées de fonction), mais cela ne répond pas à ma question.
@FeDericopoloni - Que voulez-vous dire? Cela répond directement à votre question, et c'est de Mathworks eux-mêmes. Les globaux sont lents car (1) Le moteur doit rechercher en dehors de l'espace de travail lors de la recherche de la variable, et (2) L'accélérateur n'oblise pas les appels mondiaux.
Peut-être que je n'étais pas assez clair dans la question, mais je ne sais pas comment le reformuler. Ce que je veux demander est: "Pourquoi l'analyseur de code est-il de se plaindre d'un global code> dans une instruction code> si code> est vraiment vrai que
global code> à l'intérieur un
si code> est plus lent d'un dans une "relevé de niveau supérieur", ou est-ce juste un avertissement mal formulé? " Je sais que
global code> est lent, mais c'est quelque chose de légèrement différent.
La réponse de Walter Roberson ici http://mathworks.com/matlabentral/answers/19316 -Global-pourrait-être-très inefficace # réponse_25760 p>
[...] Ce n'est pas nécessairement plus de travail si non fait dans une commande de haut niveau, mais les gens auraient tendance à mettre la construction dans une boucle ou dans plusieurs endroits non exclusifs dans des structures conditionnelles. Il est beaucoup plus facile pour une personne qui rédige des avertissements Mlint ne doit pas avoir à ajouter des éclaircissements comme: "Sauf si vous ne pouvez prouver que ces" globaux "ne seront exécutés qu'une fois, auquel cas il n'est pas moins efficace, mais il est encore une mauvaise forme" p> blockQuote>
prend en charge mon option (1). P>
fait (de Matlab 2014 jusqu'à Matlab 2016a et n'utilise pas la boîte à outils Parallell): Souvent, le code le plus rapide que vous puissiez réaliser avec MATLAB est de faire des fonctions imbriquées, partageant vos variables entre les fonctions sans les transmettre. P>
L'étape proche de celle-ci, utilise des variables globales et scinder votre projet dans plusieurs fichiers. Cela peut diminuer légèrement la performance, car (supposément, bien que je ne l'ai jamais vue vérifiée dans des tests) Matlab encourage les frais généraux en récupérant de l'espace de travail global, et parce qu'il y a une sorte de problème (soi-disant, même s'il n'ya jamais eu aucune preuve de celui-ci. ) avec l'accélération JIT. P>
À travers mes propres tests, en passant des très grandes matrices de données (images Hi-RES) entre les appels vers des fonctions, l'utilisation de fonctions imbriquées ou de variables globales sont presque identiques en performances. P>
La raison pour laquelle vous pouvez obtenir des performances supérieures avec des variables globales ou des fonctions imbriquées, c'est parce que vous pouvez éviter de copier des données supplémentaires de cette façon. Si vous envoyez une variable à la fonction, MATLAB le fait en référence, mais si vous modifiez la variable dans la fonction, MATLAB en fait une copie à la volée (Copie-on-écriture). Je sais aucun moyen de l'éviter à Matlab, à l'exception des fonctions imbriquées et des variables mondiales. Toute petite vidange que vous obtenez de l'hoururance à JIT ou à des heures d'extraction globale, est totalement gagnée en évitant de la copie supplémentaire de données (lors de l'utilisation de données plus grandes). P>
Cela peut avoir changé avec jamais de versions de Matlab, mais d'après ce que j'entends d'amis, j'en doute. Je ne peux plus soumettre de test, n'a plus de licence MATLAB. p>
comme preuve, ne cherchez pas plus loin que ceci Boîte à outils du traitement vidéo J'ai fait de retour dans la journée je travaillais avec Matlab. C'est horriblement laid sous le capot, car je n'avais aucun moyen d'obtenir une performance sans globaux. P>
Ce fait sur MATLAB (que les variables globales sont la manière la plus optimisée que vous pouvez coder lorsque vous devez modifier de grandes données dans différentes fonctions), indique que la langue et / ou l'interpréteur doivent être mises à jour. P>
Au lieu de cela, Matlab pourrait utiliser une notion meilleure et plus dynamique d'espace de travail. Mais rien que j'ai vu indique que cela se produira jamais. Surtout lorsque vous voyez la communauté des utilisateurs ignorant apparemment les faits et poussez des oppsions en avant sans aucune base: comme l'utilisation de globaux dans Matlab sont lents. p>
Ils ne sont pas. P>
Cela dit, vous ne devriez pas utiliser les globaux, jamais. Si vous êtes obligé de faire un traitement vidéo en temps réel dans Pure Matlab, vous ne trouvez que vous n'avez aucune autre option, puis à l'aide de globaux pour atteindre la performance, vous devez obtenir la langue et modifier la langue. Il est temps d'entrer dans des langues de performance plus élevées ... et peut également écrire un défenseur occasionnel sur le débordement de la pile, dans l'espoir que Matlab peut être amélioré en influençant les oppinions de ses utilisateurs. P>
Ceci est affiché sur mathworks.com/matlabentral/ Réponses / ... . Désolé pour ça: Je voulais d'abord publier là-bas, mais j'ai eu un 404, alors j'ai supposé que cela n'avait pas travaillé et que cela ne vous a pas fait.