MATLABOOP是慢的还是我做错了什么?

MATLABOOP是慢的还是我做错了什么?

我在试验MATLAB OOP,作为一个开始,我模仿了我的C+的Logger类,我把我所有的字符串助手函数都放在一个String类中,认为能够这样做是很棒的。a + ba == ba.find( b )而不是strcat( a b )strcmp( a, b )的第一个元素。strfind( a, b )

问题:放缓

我把上面的东西放了起来,立即注意到激烈减速。我是做错了(这当然是可能的,因为我有相当有限的MATLAB经验),还是MATLAB的OOP只是引入了大量的开销?

我的测试用例

下面是我对字符串所做的简单测试,基本上只是追加一个字符串并再次删除附加的部分:

classdef String < handle
  ....  properties
    stringobj = '';
  end
  function o = plus( o, b )
    o.stringobj = [ o.stringobj b ];
  end
  function n = Length( o )
    n = length( o.stringobj );
  end
  function o = SetLength( o, n )
    o.stringobj = o.stringobj( 1 : n );
  endendfunction atest( a, b ) %plain functions
  n = length( a );
  a = [ a b ];
  a = a( 1 : n );function btest( a, b ) %OOP
  n = a.Length();
  a = a + b;
  a.SetLength( n );function RunProfilerLoop( nLoop, fun, varargin )
  profile on;
  for i = 1 : nLoop
    fun( varargin{ : } );
  end
  profile off;
  profile report;a = 'test';aString = String( 'test' );RunProfilerLoop( 1000, @(x,y)atest(x,y), a, 'appendme' );RunProfilerLoop( 1000, @(x,y)btest(x,y), aString, 'appendme' );

结果

总时间(以秒为单位),用于1000次迭代:

Btest 0.550(带String.etLength 0.138,String.plus 0.065,String.Length 0.057)

顶楼0.015

记录器系统的结果同样是:对于1000次调用,结果为0.1秒frpintf( 1, 'test\n' ),7(!)在内部使用String类时对我的系统的1000个调用的秒(好的,它有更多的逻辑,但是与C+相比:我的系统的开销std::string( "blah" )std::cout在输出端对平原std::cout << "blah"是1毫秒左右。)

在查找类/包函数时,它仅仅是开销吗?

由于MATLAB是被解释的,所以它必须在运行时查找函数/对象的定义。因此,我想知道,在查找类或包函数与路径中的函数时,可能涉及到更多的开销。我试过测试这个,结果变得更奇怪了。为了排除类/对象的影响,我将在路径中调用函数与包中的函数进行比较:

function n = atest( x, y )
  n = ctest( x, y ); % ctest is in matlab pathfunction n = btest( x, y )
  n = util.ctest( x, y ); % ctest is in +util directory, parent directory is in path

所得结果与上述相同:

每秒0.004秒,0.001秒

0.060秒,0.014秒

那么,所有这些开销是来自MATLAB花费时间查找其OOP实现的定义,而对于直接在路径中的函数来说,这种开销并不存在吗?


慕桂英546537
浏览 897回答 3
3回答

慕森卡

Handle类在为清理目的跟踪对自身的所有引用时有额外的开销。在没有使用句柄类的情况下,尝试相同的实验,看看结果如何。

万千封印

OO性能在很大程度上取决于所使用的MATLAB版本。我不能评论所有版本,但根据经验,2012 a比2010年版本有了很大改进。没有基准,所以没有数字提供。我的代码,只使用句柄类编写,在2012 a下编写,在早期版本中根本不会运行。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

MongoDB