为回调创建匿名函数需要太长时间

时间:2014-04-02 13:10:23

标签: matlab

我有一个用户界面(手动创建,不使用GUIDE),它允许我可视化非常大和复杂的数据集。数据只读一次(大约需要2-3分钟),GUI基本上是数据的动态视图。这意味着,当我使用GUI中的导航按钮时,只更新视图(即一堆带索引的数组)和一些图表。

我的问题是即使这需要太长时间。实际上,更改视图需要花费一秒钟,当您需要导航很多时,这非常烦人。我已将问题跟踪到脚本中的以下4行:

set(ud.h_hid, 'Callback', @(obj, event) handle_hypothesis_change(obj, event, current_cluster_id, msg_idx, static_data));
set(ud.h_cid, 'Callback', @(obj, event) handle_cluster_change(obj, event, static_data));
set(ud.h_prev, 'Callback', @(obj, event) handle_message_change(obj, event, current_cluster_id, msg_idx-1, static_data));
set(ud.h_next, 'Callback', @(obj, event) handle_message_change(obj, event, current_cluster_id, msg_idx+1, static_data));

这四行一起需要1.07秒(与tic; toc一起计时),相当于脚本执行时间的99%左右。 这些行仅为GUI中的四个按钮设置回调(由四个句柄标识)。在分析器中,我看到以下内容(对于第一个set(...)

my_gui_function>create@(obj,event)handle_cluster_change(obj,event,static_data) (1 call, 0.158 sec)

(从一个探查器运行到下一个探测器运行,0.158秒在0.1到0.25秒之间变化。)

我的问题是双重的:

  1. 为什么这需要这么长时间?
  2. 我该如何解决?

1 个答案:

答案 0 :(得分:1)

回调的定义有点不寻常,我不知道为什么这么长时间。

如果我设置回调,我会这样做,无论是否修复它我都不知道 - 你必须在你的代码中尝试它。

set(ud.h_hid, 'Callback', {@handle_hypothesis_change, current_cluster_id, msg_idx, static_data});
set(ud.h_cid, 'Callback', {@handle_cluster_change, static_data});
set(ud.h_prev, 'Callback',{@handle_message_change,current_cluster_id, msg_idx-1, static_data});
set(ud.h_next, 'Callback', {@handle_message_change, current_cluster_id, msg_idx+1, static_data));

请注意,使用此单元格数组格式时,obj和event将自动传递给函数。

http://www.mathworks.co.uk/help/matlab/creating_guis/writing-code-for-callbacks.html