在使用者介面周圍傳遞資料時的效能問題
兩種主要技術允許在 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
包含許多具有大資料的欄位,則結果將更改。