Это удивительное поведение. Промежуточный вызов функции не должен так ускоряться.
Попробуйте его профилировать и посмотрите, где он проводит свое время. Это лучший первый вариант почти для любого "Почему мой код Matlab медленный?" вопрос.
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
Там заканчивается совет. Здесь начинается предположение.
Есть две вещи, которые отличаются в двух вызовах. Существует взаимодействие рабочего пространства. Вызов foo () из командной строки может оставить переменную ans в вашем рабочем пространстве. Когда вызывается из bar (), ANS будет установлен, но затем сразу очищается, когда bar () возвращается. Кроме того, foo () может использовать evalin () / assignin () для просмотра рабочих пространств вверх по стеку вызовов и может взаимодействовать с переменными, назначенными в вашей базовой рабочей области. Функция bar () имеет чистое рабочее пространство.
В зависимости от того, где находится bar.m, он может фактически вызывать другой foo (), или, возможно, разрешать его немного по-другому. Проверьте разрешение пути с помощью «which foo» в обоих контекстах.
В зависимости от того, как определено «args», для foo могут быть видны различные входные имена ().
Кроме того, foo () может содержать патологический код, который проверяет, вызывается ли он из базовой рабочей области или даже вызывается ли функцией из определенного имени, и ведет себя по-разному в зависимости от этого.
Тем не менее, это в основном должны быть незначительные взаимодействия и не должны вызывать замедление этого порядка. Я подозреваю, что происходит что-то еще, может быть, просто под воздействием немного разных контекстов вызова. Добавление уровня косвенности с помощью bar () не должно быть ответом. Посмотрите, что должен сказать профилировщик и оттуда. Точный код для воспроизведения очень поможет в получении помощи от сообщества.