MatlabOOP与慢速运算符重载
是否可以从下面的简单类中获得3-6倍的加速 我试图创建一个类,它假装是一个内联函数,但是括号/subsref操作符重载对我来说不够快 我创建了类MatlabOOP与慢速运算符重载,oop,matlab,optimization,Oop,Matlab,Optimization,是否可以从下面的简单类中获得3-6倍的加速 我试图创建一个类,它假装是一个内联函数,但是括号/subsref操作符重载对我来说不够快 我创建了类CTestOp来替换内联函数f=@(x)A*x,方法是让subsref获取一个向量,并将其与类属性A相乘 基准测试表明,对于较小的A和x(例如,m=5),使用内联函数所需的时间是只写A*x所需的时间的4-7倍,使用类所需的时间是使用内联函数所需的时间的4-7倍: Elapsed time is 0.327328 seconds for the class
CTestOp
来替换内联函数f=@(x)A*x
,方法是让subsref获取一个向量,并将其与类属性A
相乘
基准测试表明,对于较小的A
和x
(例如,m=5),使用内联函数所需的时间是只写A*x
所需的时间的4-7倍,使用类所需的时间是使用内联函数所需的时间的4-7倍:
Elapsed time is 0.327328 seconds for the class
Elapsed time is 0.053322 seconds for the inline function.
Elapsed time is 0.011704 seconds for just writing A*x.
我已经做了一系列的改进来达到这一点,但也存在一些问题。例如,我可以通过不要求this.A
而看到实质性的收益,但这违背了整个目的。我本想使用一个抽象类,它允许我们编写各种操作
函数——但是,虽然使类抽象并没有增加多少时间,但实际的函数调用却增加了时间
有什么想法吗
课程为:
classdef CTestOp < handle
properties
A = [];
end
methods
function this = CTestOp(A)
this.A = A;
end
function result = operation(this, x)
result = this.A*x;
end
function result = subsref(this, S)
% switch S.type
% case '()'
% result = this.operation(S.subs{1}); % Killed because this was really slow
% result = operation(this, S.subs{1}); % I wanted this, but it was too slow
result = this.A*S.subs{1};
% otherwise
% result = builtin('subsref', this, S);
% end
end
end
end
如果您想在Matlab中编写快速代码,诀窍总是将代码矢量化。 使用MatlabOO也是如此。虽然我目前无法测试它,但我很有信心,您可以通过执行一个大操作而不是许多小操作来减少开销 在您的特定示例中,您可以再次运行基准测试,并通过更改以下两行来查看我的语句是否有效:
m = 500; % Work with one big matrix rather than many tiny ones
nc = 99; % Just some number that should give you reasonable run times
如果您想在Matlab中编写快速代码,诀窍总是将代码矢量化。 使用MatlabOO也是如此。虽然我目前无法测试它,但我很有信心,您可以通过执行一个大操作而不是许多小操作来减少开销 在您的特定示例中,您可以再次运行基准测试,并通过更改以下两行来查看我的语句是否有效:
m = 500; % Work with one big matrix rather than many tiny ones
nc = 99; % Just some number that should give you reasonable run times
我确信性能和OO在Matlab中是互斥的。如果您还没有这样做,请查看本文。@slayton:OOP与Matlab的其他部分一样:避免大量不必要的函数/方法调用。在MATLAB中做OOP,就像你在java或C++中所做的(即很多有很多小方法的调用的类)效率不高。@ Navan是完全正确的,特别是注意到你使用的是点引用方法调用,调用比函数调用风格调用慢。(也就是说,您使用的是obj.method()而不是method(obj)-在内部,对于第一种样式,MATLAB首先必须检查您是否打算为obj编制索引,而不是对其调用函数(是的,即使您将paren放在了那里)。我确信性能和OO在Matlab中是互斥的。如果您还没有这样做,请查看本文。@slayton:OOP与Matlab的其他部分一样:避免大量不必要的函数/方法调用。在MATLAB中做OOP,就像你在java或C++中所做的(即很多有很多小方法的调用的类)效率不高。@ Navan是完全正确的,特别是注意到你使用的是点引用方法调用,调用比函数调用风格调用慢。(也就是说,您使用的是obj.method()而不是method(obj)-在内部,对于第一种样式,MATLAB首先必须检查您是否打算为obj编制索引,而不是对其调用函数(是的,即使您将paren放在那里)。在这种情况下,我选择了一个小维度来隔离和测量开销。的确,我们可以减少花费在开销上的时间百分比,但我们希望消除实际开销,而不仅仅是说它无关紧要。@Steve这是正确的,但是,如果您的大矩阵包含所有这些小矩阵的信息,那么也可以减少总开销(毫秒)。在这种情况下,我选择了一个小维度来隔离和测量开销。的确,我们可以减少花费在开销上的时间百分比,但我们希望消除实际开销,而不仅仅是说它无关紧要。@Steve这是正确的,但是如果你的大矩阵包含所有这些小矩阵的信息,那么也可以减少总开销(毫秒)。