2017-02-07 5 views
1

У меня есть графический интерфейс MATLAB (r2016a) с обратным вызовом windowButtonMotionFcn. Внутри обратного вызова находится блок if-elseif-else, который изменяет курсор в зависимости от того, какие оси в графическом интерфейсе мыши закончились. Он работает очень быстро, когда он сталкивается с ситуациями, когда ему нужно что-то изменить, но, согласно профилировщику, занимает значительное количество времени на команде «return».Matlab GUI windowButtonMotionFcn Slow When No Action Taken

Может ли кто-нибудь предложить понимание способа исправить это? Мне кажется, что если он не выполняет какой-либо код, он должен работать быстрее, когда он выходит из функции (т. Е. Не получает зависание на «возврат»), чем когда у него больше кода для выполнения.

Основной контур кода выглядит следующим образом:

function mouseMove(handles) 

xy = %Get cursor position 

if %xy over axes1 
    set(gcf,'Pointer','crosshair') 
elseif %xy over axes2 
    set(gcf,'Pointer','arrow') 
else 
    return %Here is where MATLAB is spending a lot of time 
end 

%A lot of additional code for when the cursor is over axes1 or axes2. 

end 
+1

Я понятия не имею, как работает профайлер для графических интерфейсов, но вы уверены, что линия не занимает больше времени, потому что ее запуск чаще всего, то есть вообще xy не по осям? Вы имеете в виду, что это занимает больше времени * на звонок * или всего? –

+0

Вы действительно хотите туда вернуться? Не приведет ли это к тому, что код выйдет из функции mouseMove до достижения «дополнительного кода, когда курсор находится над осями1/axes2?» – toshiomagic

+0

@AnderBiguri это возможно. Я посмотрю на это. – Timmortal

ответ

1

Это может быть связано с тем, что end of a function often appears in the profiler as taking a lot of time. В общем, профилировщик хорош для выявления неэффективности в вашем коде (функции, которые называются слишком много раз и т. Д.), Но на самом деле не подходит для фактического бенчмаркинга, поскольку ускорение JIT не включено. Для бенчмаркинга лучше всего использовать timeit или какую-то другую функцию.

Это, как говорится, когда я реализовать такую ​​же функцию обратного вызова, я не вижу никакой производительности удар для return заявления

enter image description here

Как @Ander отметил, следует обратить внимание на звонки столбец, так как возможно, что количество раз, которое вызывается return, просто больше, чем остальная часть обратного вызова. По умолчанию окраска данной строки основана на общее время, а не на время вызова.

+0

Итак, оказывается, что время _per call_ было примерно одинаковым для каждого случая. Чтобы исправить проблему с производительностью, я добавил чек, чтобы увидеть, когда последний раз вызывалась функция, и возвращался, если он был меньше 10 мс. Это заставило функцию работать бесперебойно. – Timmortal