2016-01-11 5 views
-2

J'essaie d'utiliser ByteBuffer comme un stockage interne pour une classe. Je souhaite résumer les manipulations flip() et ByteBuffer de la part de l'appelant, mais je ne souhaite pas non plus utiliser slice() car cela crée des déchets supplémentaires.comment couper bytebuffer SANS créer de déchets

Existe-t-il des alternatives ou des suggestions de conception?

+0

Pouvez-vous clarifier plus de détails sur la façon dont vous voulez découper le 'ByteBuffer'? Si vous conservez le 'ByteBuffer' de niveau supérieur, ce n'est pas vraiment une poubelle supplémentaire. –

+0

Dites que j'ai une classe: Classe X { ByteBuffer get() { \t return temp.slice(); \t} ensemble de void (ByteBuffer dans) { temp.clear(); // Copie temp.flip() }} Comment puis-je obtenir une telle réécriture que je ne crée pas de déchets, et pas remettre l'appelant un tampon d'octets que l'appelant a besoin de retourner – user5775299

Répondre

0

En supposant que vous exécutez sur hotspot et tant que la durée de vie de la tranche est très courte, par ex. immédiatement utilisé dans la méthode la créant ou par son appelant, puis escape analysis devrait être en mesure d'éliminer cette allocation.

Il s'agit d'une optimisation JVM, donc il n'y a aucune garantie que cela arrive, mais il est généralement assez bon pour ne pas s'inquiéter de ces choses.

En outre, les jeunes GC sont très efficaces. Le coût de ces objets de courte durée est très faible, même si EA ne démarre pas.

De même, vous devriez éviter les optimisations prématurées. S'inquiéter de ces choses une fois que vous avez mesuré la performance et compris où sont les goulots d'étranglement réels.