Является ли `cd` быстрее, чем` addpath`, мотивацией для его использования?

Один из моих ответов недавно был отклонен за предложение использовать cd(path_to_toolbox), а не один из path инструментов. , например addpath или rmpath. Учитывая яростную критику, которую я получил, я должен представить, что есть очень веские причины для использования path инструментов, по-видимому, они в некотором роде более надежны, особенно когда код распространяется на другие системы.

Затем я решил измерить производительность cd по сравнению с addpath и был удивлен, обнаружив следующий результат. Перед каждым испытанием я очищал рабочее пространство и создавал массив строк с чередующимися путями:

clear
clc

p1 = 'c:\MATLAB7\toolbox\symbolic\@sym\';
p2 = matlabroot;

newpath = repmat(' ',100,100);

for ii=1:2:99
    newpath(ii,1:length(p1)) = p1;    
    newpath(ii+1,1:length(p2)) = p2;    
end

Затем я запустил либо addpath, либо cd следующим образом:

tic
for ii=1:100
    addpath(newpath(ii,:))
end
toc

Истекшее время 13,437000 секунд.

tic
for ii=1:100
    cd(newpath(ii,:))
end
toc

Истекшее время - 1.078000 секунд.

Любые комментарии относительно того, существуют ли условия, при которых использование cd может быть оправдано, например, для установки пути к функции (панели инструментов или иным образом), приветствуются. Хотя это может быть сочтено небрежным, у меня есть использовался cd в течение многих лет, и хотя замедление может быть заметным при повторном использовании, я считаю, что если он не используется в сильно повторяемых частях программы, замедление стоит той простоты, которую оно привносит в кодирование. Примечательно, что addpath не сложнее в использовании, но теперь у меня есть реальная причина предпочесть cd: он на самом деле быстрее.

Изменить

В качестве постскриптума к этому сообщению я умоляю mea culpa извращать использование cd (и в этом примере addpath). Однако должно быть место для такого использования на языке, который часто используется для быстрого написания сценариев. Следует иметь в виду, что существует градация опыта среди пользователей Matlab, и в некоторых случаях менее "продвинутые" и кажущиеся небрежными методы программирования могут фактически быть истолкованы как выгодные в краткосрочной перспективе (если не в долгосрочной перспективе, или где управление версиями и структурой каталогов может стать проблематичным).

В качестве приложения я включаю несколько ссылок на сообщения в SO и за его пределами, переопределение встроенных функций, затенение и т. Д., Где можно использовать addpath (и я бы поспорил и cd):

Как показать отменяемую функцию?

Как получить дескриптор для встроенная функция переопределения?

Как обернуть уже существующую функцию новой функцией с тем же именем

http://www.mathworks.in/matlabcentral/newsreader/view_thread/264354


person Buck Thorn    schedule 17.08.2013    source источник
comment
Путь addpath не требует изменения текущего каталога Matlab, он добавляет его в путь поиска Matlab. Предположим, у вас есть файлы в нескольких разных папках, тогда вам придется менять текущий каталог Matlab каждый раз, когда вы хотите использовать функцию или класс, который находится в другом пути ...   -  person Werner    schedule 18.08.2013
comment
Что произойдет, если вы добавите пути, а не добавление по умолчанию? Однако ваше сравнение действительно справедливо. Дело в том, что путь может быть установлен и сохранен, тогда как cd нужно будет вызывать каждый раз в сценарии (дважды, если вы хотите вернуть пользователя к его последнему pwd). В некоторых случаях cd-ing может потенциально нарушить работу и привести к неожиданным ошибкам, например, передача функции, которая использует контент из pwd пользователя, в основную функцию, которая cd перемещается вперед и назад.   -  person horchler    schedule 18.08.2013
comment
@horchler: Вам там не хватает НЕ (НЕ справедливое сравнение) :) Хороший момент в добавлении, а не в начале.   -  person Amro    schedule 18.08.2013
comment
Также существует проблема с управлением версиями. Если я скопирую всю программу с несколькими функциями в новый каталог, то начальный компакт-диск будет выполнять столько же, сколько addpath, и, учитывая непостоянство пути в данных обстоятельствах, любой вариант кажется нормальным - если весь код скопирован в тот же каталог уровень.   -  person Buck Thorn    schedule 18.08.2013
comment
@ Амро: Ой. Да, отсутствует не. Я не умею печатать.   -  person horchler    schedule 18.08.2013
comment
@TryHard: Я бы по-прежнему избегал вставлять cds в любой обычный код. Есть copyfile, если вам нужно скопировать содержимое каталога в другое место. К сожалению, все еще нет реального управления версиями в Matlab. Было бы неплохо, если бы существовал встроенный метод установки и удаления набора инструментов или M-файла.   -  person horchler    schedule 18.08.2013
comment
Вы, по-видимому, все еще не понимаете MATLAB и то, что означает путь поиска. ВЫ НЕ ДОБАВЛЯЕТЕ добавлять новые каталоги на лету, используя addpath. Каталоги MATLAB toolbox уже должны быть на вашем пути поиска. Этот addpath был медленным, потому что MATLAB пришлось полностью перефразировать весь путь поиска. Я бы также добавил, что я удалил отрицательный голос, когда вы удалили предложение на компакт-диск в каталог панели инструментов MATLAB.   -  person    schedule 19.08.2013
comment
@woodchips Основа вашего замешательства относительно моего понимания addpath состоит в том, что я использовал его вместо cd в необычной ситуации, когда мне нужно было каким-то образом указать прямо на панель инструментов. Хотя это неприемлемо для общего использования, оно похоже на то, что использовалось в других примерах и ответах, представленных на SO. Я бы пошел в дальнейшие объяснения, но лучше оставить как есть. Спасибо, что не проголосовали против ответа. Я рад поделиться этим форумом с такими мудрыми людьми.   -  person Buck Thorn    schedule 19.08.2013
comment
@woodchips Я должен добавить, что эксперимент по времени несколько абсурден, но, как я объясняю в вопросе, я бы никогда не использовал addpath или cd таким образом в реальном приложении, это было просто концептуальным упражнением, чтобы задать вопрос: когда это использовать из cd подходящих? Я мог бы, например, открыть файлы из сценария и ожидать, что они будут в местах по умолчанию относительно основного пути. Один из способов разместить сценарий на основном пути без необходимости операций конкатенации строк или передачи имени основного пути - это cd в соответствующее место.   -  person Buck Thorn    schedule 19.08.2013
comment
Есть и другие варианты использования cd в сценариях, которые могут считаться неприемлемыми в распределенном программном обеспечении, но идеально подходят для быстрых и грязных приложений. Что ж, я приветствую вас, чтобы опубликовать ответ. Например, вы можете начать с указания на эти полезные ссылки, которые Амро любезно предоставил, при соответствующем использовании path: stackoverflow.com/questions/2129646/ mathworks.se/help/matlab/matlab_env/   -  person Buck Thorn    schedule 19.08.2013
comment
Практическое замечание: если использование cd было более быстрым вариантом, оно позволяет добавлять только 1 путь за раз, в то время как addpath позволяет добавлять все пути одновременно. Если вам нужно добавить много путей, addpath, вероятно, будет быстрее, в то время как если вы добавляете только один за раз, скорость вряд ли станет проблемой.   -  person Dennis Jaheruddin    schedule 19.08.2013
comment
@DennisJaheruddin: хороший момент, MATLAB также имеет функцию genpath для генерации строки пути для папки и всех ее подпапок, которая будет использоваться с addpath   -  person Amro    schedule 19.08.2013


Ответы (2)


Очевидно, что по мере того, как path становится длиннее, MATLAB должен будет искать больше мест для поиска функций, скриптов, классов и т. Д. Так что я полагаю, что это отрицательно повлияет на производительность, если у вас будет действительно длинный path

С другой стороны, текущий каталог - это всего лишь одно место, в котором нужно искать (конечно, с соблюдением порядка приоритета).

Кроме того, было бы несправедливо сравнивать их, если только вы не можете поместить все свои файлы в одну папку.


Просто примечание о вашем стиле кодирования: вы можете использовать массив строк, а не матрицу символов для хранения newpath:

newpath = cell(100,1);
for i=1:100
    newpath{i} = '...';
end
person Amro    schedule 17.08.2013
comment
Замечание о производительности: MATLAB обычно кэширует информацию для каталогов на пути. Кроме того, чтобы обнаруживать изменения в файловой системе и автоматически использовать новейшую версию M-файла (без явного повторного хеширования), MATLAB регистрирует обработчики для уведомления об изменениях в файловой системе (см. help changeNotification) - person Amro; 18.08.2013
comment
Да, но был задан вопрос, будут ли причины использовать cd вместо path на основе скорости (или чего-то другого). Если я правильно прочитал ваш ответ, то есть (есть?) И нет никаких оснований для того, чтобы мне отказали в предыдущем вопросе. - person Buck Thorn; 18.08.2013
comment
Я, вероятно, должен проголосовать против использования i в цикле: это плохой стиль программирования: ›) - person Buck Thorn; 18.08.2013
comment
нет, я хотел сказать, что ваш тест не является справедливым сравнением. Постоянно переключаться между папками для использования функций, находящихся в разных местах, непрактично и непереносимо. path был разработан для этой цели. - person Amro; 18.08.2013
comment
ха-ха, вещь i - это привычка, от которой трудно избавиться :) Плюс я действительно не возражаю, так как я всегда использую 1i, когда хочу получить воображаемую единицу, без путаницы .. - person Amro; 18.08.2013
comment
Я понимаю суть дела. Но у меня была ситуация, когда я обрабатывал противоречивые значения перегруженной функции (diff), и было необходимо указать непосредственно на функцию. В любом случае в примере, на котором я основывал свой ответ, требовалось явное использование пути к функции панели инструментов, которую можно было бы использовать либо path, либо cd. Таким образом, их использование в этом частном случае было бы эквивалентным. Я не пропагандировал плохой стиль кодирования, я искал обходной путь для одного несколько необычного (но не на самом деле) случая. - person Buck Thorn; 18.08.2013
comment
хм, не могли бы вы использовать builtin для вызова исходной функции из перегруженной? - person Amro; 18.08.2013
comment
По умолчанию сценарий использует встроенную функцию. Хммм, я все же думаю, что могу понять вашу точку зрения. - person Buck Thorn; 18.08.2013
comment
Я не уверен, что пытался сделать OP в этом связанном вопросе, но я не вижу источника путаницы. Если вам нужна символьная дифференциация, вы должны определить x как символьную переменную (syms x), если вы хотите числовую разницу, определите x как таковую (x = 1:100). Если я не ошибаюсь, здесь нет совпадений и нет необходимости возиться с path. Вы видите, что MATLAB отправляет вызовы функций на основе типа первого аргумента, поэтому, если x является символическим, он вызовет @sym/diff, в противном случае - обычный. Помните, что fun(obj) похож на obj.fun() для вызовов методов объектов - person Amro; 18.08.2013
comment
См. Здесь для получения дополнительной информации: mathworks.com/help/ matlab / matlab_oop / - person Amro; 18.08.2013
comment
Вы правы ... но что, если копии функции конфликтуют. Конечно, это тоже плохой стиль программирования, но это может легко случиться с управлением версиями, если я сделаю копию программы. - person Buck Thorn; 18.08.2013
comment
Я также должен отметить, что в этом конкретном случае ответ Matlab на перегруженную функцию, которая выбирает правильную версию на основе ввода, не удался. - person Buck Thorn; 18.08.2013
comment
Я не уверен, о каком случае мы говорим ... Чтобы продолжить обсуждение, не могли бы вы отредактировать свой вопрос, указав конкретный пример, в котором при вызове функции происходит сбой и вызывается неправильная перегруженная версия? - person Amro; 18.08.2013

Я думаю, что если вы используете cd для добавления чего-то вроде этого, следует избегать большинства недостатков:

function addpathwithcd(pathToAdd)
currentPath = pwd;
cd(pathToAdd);
cd(currentPath);

Однако после выполнения (очень небольшого) теста это не кажется мне быстрее, чем простое использование addpath(pathToAdd).

На самом деле для меня это немного сюрприз, так как вы записываете разницу в скорости в 13 раз, в то время как я использую CD только дважды, поэтому я ожидал разницы в скорости в 6 раз или около того.

person Dennis Jaheruddin    schedule 19.08.2013