7
votes

"Global pourrait être très inefficace"

J'utilise (dans matlab) A instruction globale à 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.

L'analyseur de code avertit moi que " global 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:

  1. Qu'est-ce que cet avertissement signifie vraiment est " global 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é)

  2. 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.

    Laquelle de ces deux explications est correcte? (Ou peut-être ni n'est ni?)

    Merci d'avance.

    EDIT: Pour que ce soit plus clair: je sais que global 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 xxx

    mais pas sur xxx

    Je trouve difficile de Imaginez une raison pour laquelle la première devrait être plus lente que la seconde.


1 commentaires

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.


4 Réponses :


3
votes

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.

Quoi qu'il en soit, je vous recommande de lire les deux entrées suivantes sur le blogs mathrocks par loren et Doug :

  1. écrire du code déployable , le La toute première chose qu'il écrit dans ce poteau
  2. Top 10 des pratiques de code MATLAB qui me font pleurer , n ° 2 sur cette liste.

    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.


2 commentaires

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.



6
votes

Supplément Eykanals Post, Cette Note technique donne une explication à laquelle global est lent.

... 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.


3 commentaires

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 dans une instruction si est vraiment vrai que global à l'intérieur un si est plus lent d'un dans une "relevé de niveau supérieur", ou est-ce juste un avertissement mal formulé? " Je sais que global est lent, mais c'est quelque chose de légèrement différent.



3
votes

La réponse de Walter Roberson ici http://mathworks.com/matlabentral/answers/19316 -Global-pourrait-être-très inefficace # réponse_25760

[...] 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"

prend en charge mon option (1).


0 commentaires

0
votes

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.

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.

À 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.

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).

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.

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.

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.

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.

Ils ne sont pas.

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.


0 commentaires