Non chiamare una costante utilizzando myClass.myconst
senza creare prima un'istanza! A meno che la velocità non sia un problema. Avevo l'impressione che la prima chiamata a una proprietà costante avrebbe creato un'istanza e che tutte le chiamate future avrebbero fatto riferimento a tale istanza, (Properties with Constant Values), ma non credo più che sia così. Ho creato una funzione di prova di base di forma:
tic;
for n = 1:N
a = myObj.field;
end
t = toc;
Con le classi definite come:
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
Per diverso casi di oggetti, oggetti maniglie, oggetti nidificati ecc. (così come le operazioni di assegnazione). Si noti che questi erano tutti scalari; Non ho studiato matrici, celle o caratteri. Per N = 1.000.000 miei risultati (per il tempo trascorso totale) sono stati:
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)
Ho anche creato una classe Java e corse un test simile:
12.18 17.53 'jObj.field > in matlab for loop'
0.0043 0.0039 'jObj.get and jObj.set loop N times internally'
L'overhead nel chiamare l'oggetto Java è alto, ma all'interno dell'oggetto, le semplici operazioni di accesso e assegnazione avvengono velocemente come gli oggetti MATLAB regolari. Se si desidera il comportamento di riferimento per l'avvio, Java potrebbe essere la strada da percorrere. Non ho studiato le chiamate agli oggetti all'interno di funzioni annidate, ma ho visto alcune cose strane. Inoltre, il profiler è spazzatura quando si tratta di molte cose, ed è per questo che sono passato a salvare manualmente i tempi.
Per riferimento, la classe Java utilizzata:
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;
}
}
}
In una nota correlata, ecco un link a una tabella di costanti NIST: ascii table e una funzione MATLAB che restituisce una struct con quei valori elencati: Matlab FileExchange
In genere utilizzo una classe MATLAB per contenere tutti i miei parametri configurabili. Questo ti dà anche la possibilità di creare più configurazioni e scambiarle facilmente e facilmente. È anche possibile creare una serie di configurazioni e iterare attraverso l'array, eseguendo a turno il codice di test su ciascuna configurazione. – bta