Matlab: неиспользуемая часть коммутатора замедляет сценарий M-файла - PullRequest
1 голос
/ 23 июля 2010

Я новичок в Matlab и программировании в целом, но мне любопытно, что я заметил в конкретном сценарии, который я сделал. У меня есть «Switch» в довольно сложном цикле for, который запускается много раз. При тестировании файла, в котором используются только случаи 0-4, я заметил, что если я удаляю варианты переключения 5-8 (без других изменений), мое время увеличивается с 18,2 до 4,5 секунд. Был ли я неправ, считая, что дела пропущены и не окажут заметного влияния на сроки, если они не использовались?

PS Я новичок во всем этом, так что это может быть ошибка пользователя, но я попытался проверить все, чтобы убедиться, что это не

EDIT

Хорошо, спасибо за помощь. Профилировщик был очень крут, но я не думаю, что он помог мне понять, что же не так. То, что замедляло код больше всего, это один конкретный оператор «если», который на самом деле содержит переключатель. Он был вызван 3 169 449 раз в каждом случае, но занял 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 перед переключателем.

Ответы [ 3 ]

2 голосов
/ 23 июля 2010

Возможно, вы захотите запустить свой код с включенным профилировщиком MATLAB.Он точно скажет, какие функции были вызваны, сколько раз и сколько времени заняла каждая.

Для получения дополнительной информации см.

doc profile

.

0 голосов
/ 23 июля 2010

Причина, по которой неиспользуемая часть переключателя может замедлять работу, может быть связана с ускорителем. Введите feature accel off в командной строке, чтобы включить ускоритель JIT, и повторите сравнение. Я предполагаю, что время будет медленным для обеих версий.

Не забудьте снова включить акселератор с помощью feature accel on!

0 голосов
/ 23 июля 2010

Я действительно сомневаюсь, что это реальная проблема, если у вас нет сложного выражения, оцененного в тематическом тесте, то есть:

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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...