¡No llame a una constante usando myClass.myconst
sin crear primero una instancia! A menos que la velocidad no sea un problema. Tenía la impresión de que la primera llamada a una propiedad constante crearía una instancia y luego todas las llamadas futuras harían referencia a esa instancia, (Properties with Constant Values), pero ya no creo que ese sea el caso. He creado una función de prueba muy básico de la forma:
tic;
for n = 1:N
a = myObj.field;
end
t = toc;
Con clases definidas como:
classdef TestObj
properties
field = 10;
end
end
o:
classdef TestHandleObj < handle
properties
field = 10;
end
end
o:
classdef TestConstant
properties (Constant)
field = 10;
end
end
Para diferentes casos de objetos, objetos de manejo, objetos anidados etc. (así como las operaciones de asignación). Tenga en cuenta que estos fueron todos escalares; No investigué matrices, celdas o caracteres. Para N = 1.000.000 mis resultados (por el tiempo transcurrido total) fueron:
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)
También creé una clase Java y se pasó una prueba similar:
12.18 17.53 'jObj.field > in matlab for loop'
0.0043 0.0039 'jObj.get and jObj.set loop N times internally'
La sobrecarga de llamar al objeto Java es alta, pero dentro del objeto, las operaciones simples de acceso y asignación ocurren tan rápido como los objetos regulares de Matlab. Si desea que arranque el comportamiento de referencia, Java puede ser el camino a seguir. No investigué llamadas a objetos dentro de funciones anidadas, pero he visto algunas cosas raras. Además, el generador de perfiles es basura cuando se trata de muchas de estas cosas, por lo que pasé a guardar manualmente los tiempos.
Como referencia, la clase Java utilizadas:
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;
}
}
}
En una nota relacionada, aquí hay un enlace a una tabla de constantes NIST: ascii table y una función de Matlab que devuelve una estructura con esos valores enumerados: Matlab FileExchange
Normalmente utilizo una clase MATLAB para mantener todos mis parámetros configurables. Esto también le brinda la posibilidad de crear múltiples configuraciones e intercambiarlas fácilmente. Incluso puede crear una serie de configuraciones e iterar a través de la matriz, ejecutando su código de prueba en cada configuración sucesivamente. – bta