为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕桂英546537 2019-07-01 16:16:52
MATLABOOP是慢的还是我做错了什么?我在试验MATLAB OOP,作为一个开始,我模仿了我的C+的Logger类,我把我所有的字符串助手函数都放在一个String类中,认为能够这样做是很棒的。a + b, a == b, a.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实现的定义,而对于直接在路径中的函数来说,这种开销并不存在吗?
查看完整描述

3 回答

?
慕森卡

TA贡献1806条经验 获得超8个赞

Handle类在为清理目的跟踪对自身的所有引用时有额外的开销。

在没有使用句柄类的情况下,尝试相同的实验,看看结果如何。


查看完整回答
反对 回复 2019-07-01
?
万千封印

TA贡献1891条经验 获得超3个赞

OO性能在很大程度上取决于所使用的MATLAB版本。我不能评论所有版本,但根据经验,2012 a比2010年版本有了很大改进。没有基准,所以没有数字提供。我的代码,只使用句柄类编写,在2012 a下编写,在早期版本中根本不会运行。


查看完整回答
反对 回复 2019-07-01
  • 3 回答
  • 0 关注
  • 802 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信