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贡献1891条经验 获得超3个赞
没有找到匹配的内容?试试慕课网站内搜索吧
- 3 回答
- 0 关注
- 896 浏览
添加回答
举报
0/150
提交
取消