Par "fonction immuable" ou "méthode immuable", j'entends une fonction dont le résultat ne variera jamais si vous lui donnez les mêmes arguments.Fonctions immuables en cache ou précalculées en C#/C++
Je serais intéressé de savoir si quelqu'un connaît une solution plus générique ou moins verbeuse lorsque vous voulez mettre en cache les valeurs précalculées d'une fonction immuable.
Laissez-moi vous expliquer ce que je veux dire par un exemple simple:
//Let's assume that ComputeStuff() returns a widely used value
//and that
//1. It is immutable (it will always return the same result)
//2. its performance is critical, and it cannot be accepted to compute
// the result at each call, because the computation is too slow
//I show here a way to solve the problem, based on a cached result.
//(this example works in a case of a method with no arguments.
// A hash would be required in order to store multiple precomputed results
//depending upon the arguments)
private string mComputeStuff_Cached = null;
public string ComputeStuff()
{
if (mComputeStuff_Cached != null)
return mComputeStuff_Cached ;
string result;
//
// ...
//Do lots of cpu intensive computation in order to compute "result"
//or whatever you want to compute
//(for example the hash of a long file)
//...
//
mComputeStuff_Cached = result;
return mComputeStuff_Cached ;
}
Notes:
- J'ai ajouté la balise C++ comme une solution en C++ serait aussi me intéresser
- Le concept de « fonctions immuables "est commun aux développeurs de bases de données, puisqu'une fonction peut être définie comme" immuable ", ou" immuable dans une transaction "(c'est un bon moyen d'améliorer la performance des requêtes).
Merci à l'avance
Je ne suis pas sûr si un chèque pour voir si mComputeStuff_Cached est vide() est suffisante. Il se pourrait que empty() soit un résultat légitimement mis en cache. Cela dépend de l'application, je suppose. –
Oui. Mais c'est le maximum que nous pouvons en C++ pour la nullité de C#, je suppose. – dirkgently
Ou pour un tarif de difficulté plus élevé, utilisez pthread_once (ou boost :: call_once) pour remplir le cache en toute sécurité. Qui résout également le problème de "valeur vide". –