Quelle taille fait un tampon doivent être en Java avant qu'il vaut le coup de réutiliser?
Ou, dans l'autre sens: je peux allouer à plusieurs reprises, d'utiliser et de jeter byte[] objets OU d'exécuter une piscine pour les garder et de les réutiliser. Je pourrais allouer beaucoup de petits tampons de se jeter souvent, ou quelques grands qui ne le sont pas. À quelle est la taille est moins cher pour la piscine que pour les réaffecter, et comment faire de petites allocations comparer aux grandes?
EDIT:
Ok, les paramètres spécifiques. Dire un processeur Intel Core 2 Duo CPU, dernière VM version pour OS de choix. Cette question n'est pas aussi vague que ça sonne... un peu de code et un graphique de pouvoir y répondre.
EDIT2:
Vous avez posté beaucoup de bonnes règles générales et des discussions, mais la véritable question demande pour les nombres. Post 'em (et le code aussi)! La théorie est grande, mais la preuve en est le nombre. Il n'a pas d'importance si les résultats varient en fonction de certains à partir d'un système à l'autre, je suis à la recherche d'une estimation approximative (ordre de grandeur). Personne ne semble savoir si la différence de performance sera un facteur de 1,1, 2, 10, ou 100+, et c'est quelque chose qui compte. Il est important pour n'importe quel code Java de travailler avec de grands tableaux -- mise en réseau, la bio-informatique, etc.
Suggestions pour obtenir un bon point de repère:
- Réchauffer le code avant de l'exécuter dans l'indice de référence. Les méthodes doivent tous être appelé au moins
100010000 fois pour obtenir la pleine JIT optimisation. - Assurez-vous comparé les méthodes de course pour au moins
110 secondes et l'utilisation du Système.nanotime si possible, pour obtenir des timings précis. - Référence sur un système qui ne fonctionne minimale applications
- Référence de 3 à 5 fois et de faire rapport tous les temps, nous voyons donc quelle est la cohérence de il est.
Je sais que c'est vague et peu exigeants en question. Je vais vérifier cette question régulièrement, et les réponses d'obtenir des commentaires et évalué régulièrement. Paresseux réponses ne seront pas (voir ci-dessous pour les critères). Si je n'ai pas toutes les réponses qui sont rigoureux, je vais joindre une prime. Je pourrais de toute façon, pour récompenser une très bonne réponse avec un petit extra.
Ce que je sais (et n'ont pas besoin répété):
- Java allocation de mémoire et GC sont rapides et de plus en plus rapides.
- Le pool d'objet utilisé pour être une bonne optimisation, mais maintenant, ça fait mal la plupart du temps.
- Objet la mise en commun est "pas une bonne idée, sauf si les objets sont coûteux à créer." Yadda yadda.
Ce que je NE sais PAS:
- Combien de temps devrais-je attendre les allocations de mémoire pour exécuter (MO/s) sur un standard moderne CPU?
- Comment fonctionne la répartition de la taille de l'effet taux d'attribution?
- Quel est le seuil de rentabilité pour nombre/taille des allocations vs ré-utiliser dans une piscine?
Les itinéraires de réponse (le plus sera le mieux):
- Un récent livre blanc présentant des chiffres pour l'attribution et le GC sur les Processeurs modernes (récente que dans la dernière année ou ainsi, JVM 1.6 ou version ultérieure)
- Code concis et corriger les micro-benchmark je peux courir
- Explication de comment et pourquoi les allocations impact sur les performances
- Des exemples du monde réel/anecdotes de tester ce type d'optimisation
Le Contexte:
Je suis en train de travailler sur une bibliothèque ajout LZF de compression support de Java. Cette bibliothèque s'étend le H2 SGBD LZF classes, en ajoutant d'autres niveaux de compression (plus de compression) et la compatibilité avec les flux d'octets à partir de la C LZF de la bibliothèque. Une des choses que je suis en train de réfléchir est de savoir si ou non il vaut la peine d'essayer de réutiliser la taille fixe les tampons utilisés pour compresser/décompresser des flux. Les tampons peuvent être ~8 ko, ou ~32 ko, et dans la version originale, ils sont ~128 ko. Les tampons peuvent être attribués à une ou plusieurs reprises par streaming. Je suis à essayer de comprendre comment je veux poignée de tampons pour obtenir les meilleures performances, avec un oeil vers potentiellement multithreading dans l'avenir.
Oui, la bibliothèque SERA publié en open source si quelqu'un est intéressé à l'utilisation de ce.