N'appelez pas une constante en utilisant myClass.myconst
sans créer une instance au préalable ! À moins que la vitesse ne soit pas un problème. J'avais l'impression que le premier appel à une propriété constante créait une instance et que tous les appels ultérieurs faisaient référence à cette instance, ( Propriétés à valeurs constantes ), mais je ne crois plus que ce soit le cas. J'ai créé une fonction de test très basique de la forme :
tic;
for n = 1:N
a = myObj.field;
end
t = toc;
Avec des classes définies comme :
classdef TestObj
properties
field = 10;
end
end
ou :
classdef TestHandleObj < handle
properties
field = 10;
end
end
ou :
classdef TestConstant
properties (Constant)
field = 10;
end
end
Pour différents cas d'objets, de manipulations d'objets, d'objets imbriqués, etc. (ainsi que pour les opérations d'affectation). Notez que ce sont tous des scalaires ; je n'ai pas étudié les tableaux, les cellules ou les chars. Pour N = 1.000.000 mes résultats (pour le temps total écoulé) étaient :
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)
J'ai également créé une classe Java et effectué un test similaire :
12.18 17.53 'jObj.field > in matlab for loop'
0.0043 0.0039 'jObj.get and jObj.set loop N times internally'
La surcharge liée à l'appel de l'objet Java est élevée, mais à l'intérieur de l'objet, les opérations simples d'accès et d'affectation sont aussi rapides que pour les objets matlab ordinaires. Si vous voulez un comportement de référence au démarrage, Java peut être la voie à suivre. Je n'ai pas étudié les appels d'objets dans les fonctions imbriquées, mais j'ai vu des choses bizarres. De plus, le profileur est nul pour beaucoup de ces choses, c'est pourquoi j'ai décidé de sauvegarder manuellement les temps.
Pour référence, la classe Java utilisée :
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;
}
}
}
Dans le même ordre d'idées, voici un lien vers un tableau des constantes du NIST : table ascii et une fonction matlab qui renvoie une structure avec les valeurs listées : Matlab FileExchange