我正在尝试使用 MATLAB 哦,作为一个开始,我模仿了 C + + 的 Logger 类,并将所有的字符串助手函数放在一个 String 类中,我认为能够做像 a + b
、 a == b
、 a.find( b )
这样的事情会很棒
strcat( a b )
,strcmp( a, b )
,检索 strfind( a, b )
的第一个元素等。
问题是: 经济放缓
我把以上的东西使用,并立即注意到一个 激烈减速。是我做错了(这当然是可能的,因为我有相当有限的 MATLAB 经验) ,还是 MATLAB 的面向对象程序只是引入了很多开销?
我的测试案例
下面是我对字符串所做的简单测试,基本上就是添加一个字符串并再次删除添加的部分:
注意: 不要在实际代码中编写这样的 String 类!Matlab 现在有一个本地
string
数组类型,您应该改用它。
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 );
end
end
function 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. SetLlength 0.138,String.plus 0.065,String. Llength 0.057)
最高0.015
Logger 系统的结果也是类似的: 1000次调用的结果是0.1秒
到 frpintf( 1, 'test\n' )
,7(!)当在内部使用 String 类时,1000次调用需要花费1毫秒的时间(好吧,它有更多的逻辑,但是与 C + + 相比: 在输出端使用 std::string( "blah" )
和 std::cout
的系统的开销与纯 std::cout << "blah"
相比大约是1毫秒)
在查找类/包函数时是否只是开销?
由于解释 MATLAB,它必须在运行时查找函数/对象的定义。因此,我想知道在查找类或包函数和路径中的函数时,可能会涉及更多的开销。我试过了,结果越来越奇怪。为了排除类/对象的影响,我比较了在路径中调用函数和在包中调用函数:
function n = atest( x, y )
n = ctest( x, y ); % ctest is in matlab path
function n = btest( x, y )
n = util.ctest( x, y ); % ctest is in +util directory, parent directory is in path
结果,收集方式与上述相同:
至少0.004秒,0.001秒
Btest 在 util.ctest 中为0.060秒,0.014秒
那么,所有这些开销是否都来自 MATLAB 花费时间查找其面向对象程序实现的定义,而对于直接在路径中的函数则不存在这些开销呢?