在使用者介面周圍傳遞資料時的效能問題

兩種主要技術允許在 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 包含許多具有大資料的欄位,則結果將更改。