`cd`比'addpath`更快是使用它的动机吗?

时间:2013-08-17 21:42:39

标签: cd matlab

我的answers之一最近因建议使用cd(path_to_toolbox)而非path工具之一而被投票,例如addpathrmpath。鉴于我收到的热烈批评,我必须想象使用path工具有很好的理由,可能它们在某种程度上更强大,特别是当代码分发给其他系统时。

然后我决定计算cdaddpath的表现,并惊讶地发现以下结果。在每次试验之前,我清除了工作空间并创建了一个具有交替路径的字符串数组:

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

然后我按照以下方式运行addpathcd

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也可以)使用:

How to unhide an overriden function?

How to get a handle to an overriden built-in function?

How to wrap an already existing function with a new function of the same name

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

2 个答案:

答案 0 :(得分:3)

显然随着path越来越长,MATLAB必须搜索更多位置以查找函数,脚本,类等。所以我想如果你有一个对性能有负面影响的话。真的很长path

另一方面,当前目录只是一个必须搜索的位置(当然是尊重优先顺序)。

另外,将两者进行比较是不公平的,除非您可以将所有文件放在一个文件夹中。


只是关于你的编码风格的说明:你可以使用字符串的cellarray而不是char-matrix来存储newpath

newpath = cell(100,1);
for i=1:100
    newpath{i} = '...';
end

答案 1 :(得分:1)

我认为如果你使用cd在这样的路径上添加一些东西,应该避免大多数的缺点:

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

但是,在进行(非常小的)测试后,对我来说这似乎不比简单地使用addpath(pathToAdd)更快。

实际上这对我来说有点令人惊讶,因为你录制13倍的速度差异,而我只使用CD两次,因此我预计速度差异大约为6倍。