J'utilise des structures de données Clojure partout mais je n'utilise aucune évaluation paresseuse. Y a-t-il une pénalité de performance pour l'utilisation de structures paresseuses partout?Performance des structures paresseuses de Clojure par rapport aux hachages/ensembles/vecteurs?
Répondre
à partir du code source:
clojure.lang.Cons
(élément de liste stricte, clojure.lang.PersistentList
est très similaire), https://github.com/clojure/clojure/blob/1.2.0/src/jvm/clojure/lang/Cons.java#L34
public Object first(){
return _first;
}
clojure.lang.LazySeq
(élément de séquence paresseux), https://github.com/clojure/clojure/blob/1.2.0/src/jvm/clojure/lang/LazySeq.java#L77
public Object first(){
seq();
if(s == null)
return null;
return s.first();
}
où
final synchronized Object sval(){
if(fn != null)
{
try
{
sv = fn.invoke();
fn = null;
}
catch(Exception e)
{
throw new RuntimeException(e);
}
}
if(sv != null)
return sv;
return s;
}
final synchronized public ISeq seq(){
sval();
if(sv != null)
{
Object ls = sv;
sv = null;
while(ls instanceof LazySeq)
{
ls = ((LazySeq)ls).sval();
}
s = RT.seq(ls);
}
return s;
}
Donc, vous êtes définitivement en payant un prix. Il dépend beaucoup de chaque cas d'utilisation particulier combien ce prix vous affecte et s'il est compensé par les économies de mémoire et le manque de calcul gaspillé que l'évaluation paresseuse vous achète.
Il y a un overhead de structures paresseuses (la réponse de pmjordan est grande pour vous donner les détails sanglants .....). Mon estimation très approximative est que vous payez une pénalité de 2-5x.
Cependant, il y a aussi des bons côtés:
- évaluation Lazy signifie que votre jeu de travail de données peut être plus petit, car il est créé uniquement en cas de besoin. Ce peut améliorer votre utilisation du cache et donc les performances dans certains cas
- L'évaluation paresseuse vous aide à écrire un code plus simple et plus propre. Vous pouvez donc vous concentrer sur l'écriture de meilleurs algorithmes. L'avantage d'avoir un meilleur algorithme (par exemple O (n log n) vs O (n^2)) peut valoir beaucoup plus que l'overhead de l'évaluation paresseuse
Mon conseil serait d'utiliser librement l'évaluation paresseuse sauf si vous êtes sûr que vous êtes dans une situation où vous avez réellement besoin de hautes performances et que vous n'avez pas les moyens de payer les frais généraux (traitement d'image, etc.)
- 1. problème de limite par rapport aux structures
- 2. Clojure Séquences paresseuses qui sont des vecteurs
- 3. Ajout de méta données aux structures Clojure
- 4. Performance OpenCL: utiliser des tableaux de primitives par rapport à des tableaux de structures
- 5. Conversion des structures de données Clojure aux collections Java
- 6. Performance des colonnes supplémentaires par rapport aux lignes supplémentaires
- 7. Overhead/performance des structures de données Python
- 8. Performance des structures de données immuables
- 9. Structures de NSData aux structures?
- 10. Structures typées ayant des pointeurs les unes par rapport aux autres
- 11. Haskell et la performance des structures mutables
- 12. Clojure par rapport à la carte
- 13. Performance des mutable par rapport à des objets immuables
- 14. Trop de variables par rapport aux tableaux
- 15. mémoire Allouer aux structures de pointeur à l'intérieur des structures
- 16. Côté serveur inclut par rapport aux techniques ASP.NET Y a-t-il une différence de performance?
- 17. Efficacité de performance dans les tables temporaires globales par rapport aux tables normales - oracle 10g
- 18. générer dynamiquement des fonctions de haute performance dans clojure
- 19. Efficacité des boucles écrites manuellement par rapport aux surcharges d'opérateur
- 20. Problème de performance avec Clojure Array
- 21. Variables par rapport aux constantes par rapport aux tableaux associatifs en PHP
- 22. Utilisation de requêtes LINQ par rapport aux procédures stockées
- 23. Emplacement des icônes par rapport aux éléments de la liste
- 24. Surcoupe par rapport aux pointeurs de fonction
- 25. Syntaxe de Perl par rapport aux références
- 26. Clojure rechercher vecteur de performance vs ensemble
- 27. initialize struct contient des références aux structures
- 28. Sérialisation binaire par rapport à JSON par rapport à xml
- 29. bourrage des séquences paresseuses du bloc binaire
- 30. MongoDB intégré par rapport à la perspective de performance