在用户界面周围传递数据时的性能问题

两种主要技术允许在 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 包含许多具有大数据的字段,则结果将更改。