Matlab:Switch的未使用部分减慢了M文件脚本

时间:2010-07-22 20:36:27

标签: matlab

我是Matlab和一般编程的新手,但我很好奇我在我制作的特定脚本中注意到了什么。我在一个相当复杂的for循环中有一个'Switch',它运行了很多次。当在仅使用0-4情况的文件上测试它时,我注意到如果我删除了5-8的交换机情况(没有其他更改),我的时间从18.2到4.5秒。我认为案件被忽略并且如果他们不使用会不会对时间产生显着影响我是错误的吗?

PS我是这一切的新手因此可能是用户错误,但我试图检查所有内容以确保它不是

修改

好的,谢谢你的帮助到目前为止。探查器的事情非常酷,但我不认为这有助于我弄清楚什么是错的。最让代码放慢速度的是一个特定的'if'语句实际上包含了这个开关。在每种情况下它被称为3,169,449次,但是在没有情况5-8和15秒的情况下花了1.22秒。代码很长,但我会发布一个简化版本,不包括案例的actaul操作。分析器告诉我的是,案例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语句。

3 个答案:

答案 0 :(得分:2)

您可能希望在启用MATLAB的分析器的情况下运行代码。它会准确地告诉你哪些函数被调用了多少次以及每次花费了多少时间。

看看

doc profile

了解更多信息。

答案 1 :(得分:0)

我真的怀疑这是真正的问题,除非你在案例测试中评估了复杂的表达,即:

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.

时机并没有那么不同:

{{1}}

答案 2 :(得分:0)

交换机未使用部分可能会减慢速度的原因可能与加速器有关。在命令行键入feature accel off以关闭JIT加速器,然后再次进行比较。我的猜测是两个版本的时间都会很慢。

不要忘记之后使用feature accel on重启加速器!