次の単純なクラスから3〜6倍のスピードアップを得ることができますか?
インライン関数のふりをするクラスを作成しようとしていますが、括弧/subsref演算子のオーバーロードが十分に速くなりません。
subsrefにベクトルを取得させ、それをクラスプロパティに対して乗算することによりCTestOp
、インライン関数を置き換える クラスを作成しました。f = @(x) A*x
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
が、それは目的全体を打ち負かします。さまざまな関数を記述できる抽象クラスを使用したかったのですがoperation
、クラスを抽象化してもそれほど時間はかかりませんでしたが、実際の関数呼び出しを行うと効果的でした。
何か案は?
クラスは次のとおりです。
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
テストコードは次のとおりです。
m = 5;
A = randn(m,m);
x = randn(m,1);
f = @(x) A*x;
myOp = CTestOp(A);
nc = 10000;
% Try with the class:
tic
for ind = 1:nc
r_abs = myOp(x);
end
toc
% Try with the inline function:
tic
for ind = 1:nc
r_fp = f(x);
end
toc
% Try just inline. so fast!
tic
for ind = 1:nc
r_inline = A*x;
end
toc