Ce comportement est surprenant. Un appel de fonction intermédiaire ne devrait pas accélérer les choses comme ça. Essayez le profilage et voyez où il passe son temps. C'est le meilleur premier recours à presque tout "Pourquoi mon code Matlab est lent?" question.
clear all
profile on -timer real
foo(args);
profile report
%read the report and save a screencap
clear all
profile clear
bar(args);
profile report
Termine le conseil. Ici commence la spéculation.
Il y a deux choses qui sont différentes dans les deux appels. Il y a une interaction de l'espace de travail. Appeler foo() à partir de la ligne de commande peut laisser la variable "ans" remplie dans votre espace de travail. Lorsqu'il est appelé à partir de bar(), ans sera défini, mais immédiatement effacé lorsque le retour de bar(). En outre, il est possible que foo() utilise evalin()/assignin() pour rechercher des espaces de travail dans la pile d'appels et qu'il puisse interagir avec des variables affectées dans votre espace de travail de base. La fonction bar() a un espace de travail propre.En fonction de l'emplacement de bar.m, il est possible qu'il invoque un foo() différent ou qu'il le résolve légèrement différemment. Vérifiez la résolution de votre chemin avec "quel truc" dans les deux contextes.
En fonction de la définition des "args", différents noms d'entrée() peuvent être visibles par foo. De plus, foo() peut contenir un code pathologique qui vérifie s'il est appelé depuis l'espace de travail de base, ou même s'il est appelé par une fonction d'un nom particulier, et se comporte différemment en fonction de cela. Ceci dit, il devrait s'agir principalement d'interactions mineures et ne devrait pas provoquer un ralentissement de cet ordre. Je soupçonnais que quelque chose d'autre se passait, peut-être juste exposé par des contextes d'appel légèrement différents. Ajouter un niveau d'indirection avec bar() ne devrait pas être la réponse. Voir ce que le profiler a à dire et partir de là. Le code exact à reproduire aidera beaucoup à obtenir de l'aide de la communauté.
Quelques questions: Est-ce reproductible (c'est-à-dire que vous l'avez exécuté plusieurs fois)? Quels sont les arguments? Y a-t-il des «collisions de noms» potentielles (une variable et une fonction portant le même nom)? – gnovice
Veuillez publier un ensemble court, mais complet, de fonctions (ou un programme si vous voulez) qui démontre ce comportement. Cela rend plus facile pour les autres de creuser et essayer de comprendre quel est le problème. –
Bien sûr, je vais voir si je peux générer le programme et l'ensemble de données les plus simples sur lesquels ce comportement est observable. Le comportement est répétable. J'ai demandé si peu d'informations pour voir si ce genre de comportement était bien connu du monde Matlab. –