Ho una funzione che posso implementare in due modi diversi. Ogni modo ha i suoi vantaggi e le prestazioni dipendono dagli argomenti che verranno forniti. Poiché ogni implementazione ha diversi cortocircuiti, le prestazioni possono essere notevolmente diverse rispetto a quelle dell'altro, quindi ho pensato di racchiudere le due implementazioni in una che "magicamente" utilizza quella più veloce.
Normalmente non mi interesserebbe questo tipo di ottimizzazioni, ma la funzione viene chiamata molto, ei cortocircuiti sono troppo gustosi per non provare questo trucco.
Tuttavia, è molto più difficile di quanto pensassi, e mi sono reso conto che non ho abbastanza conoscenze per farlo correttamente.
Quello che pensavo di avere è qualcosa del tipo:
var v1Time = v1.getExecTimeEstimate(arg1, arg2);
var v2Time = v2.getExecTimeEstimate(arg1, arg2);
var function = v1Time < v2Time ? v1 : v2;
return function.execute(arg1, arg2);
Dove getExecTimeEstimate
restituirebbe un float / doppio. Questo valore non dovrebbe essere una stima effettiva del tempo di esecuzione, ma solo qualcosa che mi permetta di confrontarlo con l'altro valore, relativamente, non assolutamente.
Quello che ho provato è contare le operazioni più basilari e restituire quel valore. Ad esempio se la funzione farebbe 30 confronti, 20 letture (da qualunque struttura dati o memoria) e 10 scritture, restituirei 60. Funziona, ma posso già dire che è molto impreciso (non accettabilmente-impreciso).
Un'altra cosa che (esteticamente) mi preoccupa è che sarà inevitabilmente costretto ad aggiungere alcune informazioni sulla performance anche nelle classi arg1 e arg2.
Come implementeresti questo? E 'questa una buona idea? Ci sono altri approcci? Conosci qualche software che usi questo tipo di trucco?
Grazie in anticipo per le tue risposte, e per favore perdona il mio povero inglese.