首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Matlab:开关的未使用部分会降低M文件脚本的速度

Matlab:开关的未使用部分会降低M文件脚本的速度
EN

Stack Overflow用户
提问于 2010-07-23 04:36:27
回答 3查看 490关注 0票数 1

总的来说,我对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的实际数字。

代码语言:javascript
运行
复制
        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语句。

EN

回答 3

Stack Overflow用户

发布于 2010-07-23 04:45:20

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

代码语言:javascript
运行
复制
doc profile

了解更多信息。

票数 2
EN

Stack Overflow用户

发布于 2010-07-23 04:53:18

我真的怀疑这是真正的问题,除非你有一个复杂的表达式在用例测试中计算,即:

代码语言:javascript
运行
复制
switch choice
    case 1
        %# ...
    case myfunction()
        %# ...
    case 3
        %# ...
end

其中myfunction()是一个昂贵的呼叫。否则,您可能会忽略实际执行5-8的一些情况,因此当您删除它们时,它们只会命中otherwise情况。

由于您没有提供任何代码,请考虑下面的示例:

代码语言:javascript
运行
复制
%%
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

时间并没有太大的不同:

代码语言:javascript
运行
复制
Elapsed time is 10.881236 seconds.
Elapsed time is 10.846885 seconds.
票数 0
EN

Stack Overflow用户

发布于 2010-07-23 15:16:16

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

之后别忘了用feature accel on重新打开加速器!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3313215

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档