首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >InputParser vs exist(.,'var')与独占性能

InputParser vs exist(.,'var')与独占性能
EN

Stack Overflow用户
提问于 2014-10-29 15:41:35
回答 1查看 630关注 0票数 1

这三种输入检查/默认初始化的变体之间是否有性能比较?

对最近的版本(如R2014b和较旧的R2012b )进行比较将是有用的。

举个例子:

代码语言:javascript
运行
复制
function foo(a,b)
  if nargin < 1, a = 1; end
  if nargin < 2, b = 2; end
end

versus

function foo(a,b)
  if exist('a','var'), a = 1; end
  if exist('b','var'), b = 2; end
end

versus 

function foo(varargin)
  p = inputParser;
  addOptional(p,'a',1)
  addOptional(p,'b',2)
  parse(p,varargin{:})
end

在R2014b上使用Amro的测试套件:

代码语言:javascript
运行
复制
  func           nargs       time   
_________________    _____    __________
'foo_nargin'         0        2.3674e-05
'foo_exist'          0        3.1339e-05
'foo_inputparser'    0        9.6934e-05
'foo_nargin'         1        2.4437e-05
'foo_exist'          1        3.2157e-05
'foo_inputparser'    1         0.0001307
'foo_nargin'         2        2.3838e-05
'foo_exist'          2        3.0492e-05
'foo_inputparser'    2        0.00015775
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-29 16:19:21

下面是一些测试这三种方法的代码:

代码语言:javascript
运行
复制
function t = testArgParsing()
    args = {1, 2};
    fcns = {
        @foo_nargin ;
        @foo_exist ;
        @foo_inputparser
    };

    % parameters sweep
    [f,k] = ndgrid(1:numel(fcns), 0:numel(args));
    f = f(:); k = k(:);

    % test combinations of functions and number of input args
    t = cell(numel(f), 3);
    for i=1:size(t,1)
        t{i,1} = func2str(fcns{f(i)});
        t{i,2} = k(i);
        t{i,3} = timeit(@() feval(fcns{f(i)}, args{1:k(i)}), 2);
    end

    % format results in table
    t = cell2table(t, 'VariableNames',{'func','nargs','time'});
end

function [aa,bb] = foo_nargin(a,b)
  if nargin < 1, a = 1; end
  if nargin < 2, b = 2; end
  aa = a;
  bb = b;
end

function [aa,bb] = foo_exist(a,b)
  if ~exist('a','var'), a = 1; end
  if ~exist('b','var'), b = 2; end
  aa = a;
  bb = b;
end

function [aa,bb] = foo_inputparser(varargin)
  p = inputParser;
  addOptional(p,'a',1);
  addOptional(p,'b',2);
  parse(p, varargin{:});
  aa = p.Results.a;
  bb = p.Results.b;
end

以下是我在我的机器上获得的R2014a:

代码语言:javascript
运行
复制
>> t = testArgParsing
t = 
          func           nargs       time   
    _________________    _____    __________
    'foo_nargin'         0        3.4556e-05
    'foo_exist'          0        5.2901e-05
    'foo_inputparser'    0        0.00010254
    'foo_nargin'         1        2.5531e-05
    'foo_exist'          1        3.7105e-05
    'foo_inputparser'    1         0.0001263
    'foo_nargin'         2        2.4991e-05
    'foo_exist'          2        3.6772e-05
    'foo_inputparser'    2        0.00015148

还有一个漂亮的图景来查看结果:

代码语言:javascript
运行
复制
tt = unstack(t, 'time', 'func');
names = tt.Properties.VariableNames(2:end);
bar(tt{:,2:end}.')
set(gca, 'XTick',1:numel(names), 'XTickLabel',names, 'YGrid','on')
legend(num2str(tt{:,1}, 'nargin=%d'))
ylabel('Time [sec]'), xlabel('Functions')

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26634672

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档