总的来说,我对Matlab和编程是个新手,但是我很好奇在我写的一个特定脚本中我注意到了什么。我在一个运行了很多次的相当复杂的for循环中有一个'Switch‘。当在一个只使用案例0-4的文件上测试它时,我注意到如果我删除了切换案例5-8 (没有其他更改),我的时间从18.2秒增加到4.5秒。我认为案例被跳过了,如果它们不使用,不会对时间产生明显的影响,这是错误的吗?
另外,我是一个菜鸟,所以这可能是用户错误,但我试图检查一切,以确保它不是
编辑
好的,谢谢你目前为止的帮助。profiler的事情非常酷,但我认为它还不能帮助我找出哪里出了问题。最让代码变慢的是一个特殊的'if‘语句,它实际上包含了开关。它在每种情况下都被调用了3,169,449次,但在没有5-8个案例的情况下花费了1.22秒,在案例5-8的情况下调用了15秒。代码非常长,但我将发布一个简化的版本,其中没有案例的实际操作。分析器告诉我的是,案例5-8从未被调用过,也不是说它们是复杂的函数,每个案例都对应于触发值为0-8的实际数字。
for x= 1:length(firstinSeq)
for y= 1:length(littledataPassed-1)
if firstinSeq(x,1)== littledataPassed(y,1) && firstinSeq(x,2)== littledataPassed(y,2) %times and flight are the same
switch firstinSeq(x,3)
case 0
case 1
case 2
case 3
case 4
end
end
end
end
同样,脚本中处理所有9种情况的部分是切换之前的if语句。
发布于 2010-07-23 04:45:20
您可能希望在打开MATLAB的分析器的情况下运行代码。它将准确地告诉您哪些函数被调用了多少次,以及每个函数花费了多少时间。
看
doc profile
了解更多信息。
发布于 2010-07-23 04:53:18
我真的怀疑这是真正的问题,除非你有一个复杂的表达式在用例测试中计算,即:
switch choice
case 1
%# ...
case myfunction()
%# ...
case 3
%# ...
end
其中myfunction()
是一个昂贵的呼叫。否则,您可能会忽略实际执行5-8
的一些情况,因此当您删除它们时,它们只会命中otherwise
情况。
由于您没有提供任何代码,请考虑下面的示例:
%%
tic
for i=1:500
choice = randi(2); %# 1 or 2
switch choice
case 1, x = lu(rand(500));
case 3, x = lu(rand(100000));
case 2, x = lu(rand(500));
case 4, x = lu(rand(100000));
otherwise, x = [];
end
end
toc
%%
tic
for i=1:500
choice = randi(2); %# 1 or 2
switch choice
case 1, x = lu(rand(500));
case 2, x = lu(rand(500));
otherwise, x = [];
end
end
toc
时间并没有太大的不同:
Elapsed time is 10.881236 seconds.
Elapsed time is 10.846885 seconds.
发布于 2010-07-23 15:16:16
开关未使用的部分可能会减慢速度的原因可能与加速器有关。在命令行中输入feature accel off
以打开JIT加速器,然后再次进行比较。我的猜测是,这两个版本的时间都会很慢。
之后别忘了用feature accel on
重新打开加速器!
https://stackoverflow.com/questions/3313215
复制相似问题