在用户界面周围传递数据时的性能问题
两种主要技术允许在 GUI 函数和回调之间传递数据:setappdata / getappdata 和 guidata( 了解更多信息 )。前者应该用于更大的变量,因为它更节省时间。以下示例测试两种方法的效率。
创建一个带有简单按钮的 GUI,并使用 guidata 和 setappdata 存储一个大变量(10000x10000 double)。该按钮在执行计时时使用这两种方法重新加载并存储变量。使用 setappdata 的运行时间和百分比改进显示在命令窗口中。
function gui_passing_data_performance()
% A basic GUI with a button to show performance difference between
% guidata and setappdata
% Create a new figure.
f = figure('Units' , 'normalized');
% Retrieve the handles structure
handles = guidata(f);
% Store the figure handle
handles.figure = f;
handles.hbutton = uicontrol('Style','pushbutton','String','Calculate','units','normalized',...
'Position',[0.4 , 0.45 , 0.2 , 0.1] , 'Callback' , @ButtonPress);
% Create an uninteresting large array
data = zeros(10000);
% Store it in appdata
setappdata(handles.figure , 'data' , data);
% Store it in handles
handles.data = data;
% Save handles
guidata(f, handles);
function ButtonPress(hObject, eventdata)
% Calculate the time difference when using guidata and appdata
t_handles = timeit(@use_handles);
t_appdata = timeit(@use_appdata);
% Absolute and percentage difference
t_diff = t_handles - t_appdata;
t_perc = round(t_diff / t_handles * 100);
disp(['Difference: ' num2str(t_diff) ' ms / ' num2str(t_perc) ' %'])
function use_appdata()
% Retrieve the data from appdata
data = getappdata(gcf , 'data');
% Do something with data %
% Store the value again
setappdata(gcf , 'data' , data);
function use_handles()
% Retrieve the data from handles
handles = guidata(gcf);
data = handles.data;
% Do something with data %
% Store it back in the handles
handles.data = data;
guidata(gcf, handles);
在我的 Xeon W3530@2.80 GHz 上,我得到了 Difference: 0.00018957 ms / 73 %
,因此使用 getappdata / setappdata 我的性能提升了 73%! 请注意,如果使用 10x10 双变量,结果不会更改,但是,如果 handles
包含许多具有大数据的字段,则结果将更改。