Почему Matlab Profiler говорит, что в операторе «конец» цикла «для» есть узкое место?

Итак, я недавно начал регулярно использовать встроенный профилировщик Matlab и заметил, что, хотя он обычно отлично показывает, какие строки занимают больше всего времени, иногда он показывает мне большой кусок времени. используется в операторе end цикла for.

Теперь, видя, что такая линия просто используется для обозначения конца цикла, я не могу представить, как она может использовать что-либо, кроме тривиального объема обработки.

Я видел конкретную версию этого вопроса, заданную в matlab Central, но консенсус, похоже, не был достигнут.

РЕДАКТИРОВАТЬ: Вот минимальный пример этой проблемы:

for i =1:1000
    x = 1;
    x = [x 1];
    % clear x;
end

Даже если вы раскомментируете clear, строка end по-прежнему требует много вычислений (около 20%), а clear фактически увеличивает абсолютный объем вычислений, выполняемых конечной строкой.


person zergylord    schedule 01.08.2011    source источник
comment
Это вероятно проблема с предварительным выделением. Хотя вы не разместили свой код, поэтому нам сложно его анализировать.   -  person Rasman    schedule 02.08.2011
comment
Я не публиковал код, потому что меня интересует общий случай, хотя я мог бы опубликовать случай или, если конкретность поможет. И, если это всегда проблема предварительного выделения, почему профилировщик не указывает на строку, которая выполняет выделение, а не на «конечную» строку?   -  person zergylord    schedule 02.08.2011
comment
@zergylord: Пожалуйста, опубликуйте минимальный пример, который воспроизводит проблему. Вам не нужно публиковать весь код здесь. В противном случае нам будет трудно попробовать это, и у нас, конечно, нет времени возиться и придумывать пример, который воссоздаст проблему.   -  person abcd    schedule 02.08.2011
comment
Если ваш цикл Matlab работает с массивами, endfor может освобождать пространство, используемое телом цикла, но не обязательно для следующей итерации цикла. Просто мысль.   -  person Ira Baxter    schedule 02.08.2011
comment
Я уже замечал это раньше, и у меня возникло ощущение, что они кладут целую кучу времени, которое нельзя выделить на определенные строки кода, на end. Тем не менее, освобождение имело бы смысл.   -  person Bill Cheatham    schedule 02.08.2011


Ответы (1)


Когда я видел это в своем коде, это было освобождение больших временных файлов, созданных в цикле. Каждая новая переменная, созданная в цикле, освобождается в точке end.

person Marc    schedule 02.08.2011
comment
Это кажется вероятным, учитывая мой опыт работы с Matlab. - person quant_dev; 02.08.2011
comment
Итак, не могли бы вы облегчить это с помощью явного освобождения переменных с помощью clear var1? - person Marcin; 02.08.2011
comment
@Marcin, кажется, это хорошо, что ОП может проверить: если он добавит очистку непосредственно перед концом, он увидит, на что тратится все время ...? - person Jonas Heidelberg; 02.08.2011
comment
@Marcin Спасибо за идею, но я только что попробовал, но безрезультатно :( - person zergylord; 02.08.2011
comment
@Marcin Итак, получается, что конечная строка освобождала память, а затем повторно накапливала ее. По-видимому, есть недокументированная команда «profile -memory on», которая позволяет вам видеть это в результатах вашего профиля. - person zergylord; 04.08.2011
comment
@zergylord Спасибо, нашел статью об этом: Недокументированные параметры профилировщика - person Kouichi C. Nakamura; 19.06.2015