myClass.myconst
最初にインスタンスを作成せずに、定数を使用して呼び出さないでください。速度が問題にならない限り。定数プロパティへの最初の呼び出しでインスタンスが作成され、その後のすべての呼び出しでそのインスタンスが参照される ( Properties with Constant Values ) という印象を受けましたが、そうではないと思います。次の形式の非常に基本的なテスト関数を作成しました。
tic;
for n = 1:N
a = myObj.field;
end
t = toc;
クラスが次のように定義されている場合:
classdef TestObj
properties
field = 10;
end
end
また:
classdef TestHandleObj < handle
properties
field = 10;
end
end
また:
classdef TestConstant
properties (Constant)
field = 10;
end
end
オブジェクト、ハンドル オブジェクト、ネストされたオブジェクトなどのさまざまなケース (および代入操作)。これらはすべてスカラーであることに注意してください。配列、セル、または文字は調査しませんでした。N = 1,000,000 の場合、私の結果 (合計経過時間) は次のとおりです。
Access(s) Assign(s) Type of object/call
0.0034 0.0042 'myObj.field'
0.0033 0.0042 'myStruct.field'
0.0034 0.0033 'myVar' //Plain old workspace evaluation
0.0033 0.0042 'myNestedObj.obj.field'
0.1581 0.3066 'myHandleObj.field'
0.1694 0.3124 'myNestedHandleObj.handleObj.field'
29.2161 - 'TestConstant.const' //Call directly to class(supposed to be faster)
0.0034 - 'myTestConstant.const' //Create an instance of TestConstant
0.0051 0.0078 'TestObj > methods' //This calls get and set methods that loop internally
0.1574 0.3053 'TestHandleObj > methods' //get and set methods (internal loop)
また、Java クラスを作成し、同様のテストを実行しました。
12.18 17.53 'jObj.field > in matlab for loop'
0.0043 0.0039 'jObj.get and jObj.set loop N times internally'
Java オブジェクトを呼び出す際のオーバーヘッドは高くなりますが、オブジェクト内では、単純なアクセスと代入操作が通常の matlab オブジェクトと同じくらい高速に行われます。参照動作を起動したい場合は、Java が適している可能性があります。ネストされた関数内でのオブジェクト呼び出しについては調査しませんでしたが、奇妙なことがいくつかありました。また、プロファイラーは、このような多くのことになるとゴミです。そのため、時間を手動で保存することに切り替えました。
参考までに、使用した Java クラスは次のとおりです。
public class JtestObj {
public double field = 10;
public double getMe() {
double N = 1000000;
double val = 0;
for (int i = 1; i < N; i++) {
val = this.field;
}
return val;
}
public void setMe(double val) {
double N = 1000000;
for (int i = 1; i < N; i++){
this.field = val;
}
}
}
関連するメモとして、NIST 定数の表へのリンクがあります: ascii テーブルと、それらのリストされた値を含む構造体を返す matlab 関数: Matlab FileExchange