不要在没有myClass.myconst
先创建实例的情况下调用常量!除非速度不是问题。我的印象是对常量属性的第一次调用会创建一个实例,然后所有未来的调用都会引用该实例(具有常量值的属性),但我不再相信这种情况。我创建了一个非常基本的表单测试函数:
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