Convertir ASCII byte[] String
Je suis en train de passer un byte[] contenant des caractères ASCII pour log4j, être enregistrés dans un fichier à l'aide de la représentation évidente. Quand je passe dans le byt[] bien entendu, il est traité comme un objet et que les journaux sont assez inutile. Lorsque j'essaie de les convertir en chaînes à l'aide d' new String(byte[] data)
, les performances de mon application est réduite de moitié.
Comment puis-je efficacement les transmettre, sans encourir les environ 30us pénalité de temps de les convertir en chaînes.
Aussi, pourquoi est-il si long à convertir?
Grâce.
Modifier
Je dois ajouter que je suis l'optimisation du temps de latence ici - et oui, 30us ne faire une différence! Aussi, ces tableaux varient de ~100 tout le chemin jusqu'à quelques milliers d'octets.
Vous devez vous connecter pour publier un commentaire.
Ce que vous voulez faire, c'est retarder le traitement de l'octet tableau[] jusqu'à ce que log4j décide qu'elle veut se connecter, le message. De cette façon, vous pourriez vous connecter à niveau de DÉBOGAGE, par exemple, pendant le test, puis de le désactiver lors de la production. Par exemple, vous pouvez:
Maintenant, vous n'avez pas à payer la pénalité sur la vitesse, sauf si vous avez réellement enregistrer les données, parce que la méthode toString n'est pas appelé jusqu'à ce que log4j décide qu'il sera en fait le journal le message!
Maintenant, je ne suis pas sûr de ce que tu veux dire par "la représentation évidente", donc j'ai supposé que tu veux dire convertir une Chaîne en réinterprétant les octets que le codage de caractères par défaut. Maintenant, si vous travaillez avec des données binaires, c'est évidemment sans valeur. Dans ce cas, je vous suggère de l'aide Les tableaux de.toString(byte[]) pour créer une chaîne formatée, le long des lignes de
ASCII est l'un des quelques que les codages peuvent être convertis vers/à partir de UTF16 avec pas de l'arithmétique ou de la table des recherches il est donc possible de convertir manuellement:
Mais assurez-vous qu'il vraiment est ASCII, ou vous vous retrouverez avec des ordures.
Si de vos données est en fait ASCII (c'est à dire 7 bits de données), vous devriez être en utilisant
new String(données, "US-ASCII")
au lieu de dépendre de la plate-forme de codage par défaut. Cela peut être plus rapide que d'essayer de l'interpréter comme votre plate-forme de codage par défaut (ce qui pourrait être en UTF-8, ce qui nécessite plus d'introspection).Vous pouvez également accélérer le processus en évitant le jeu de caractères de la Recherche frappé à chaque fois, par la mise en cache de la
Charset
instance et d'appelnew String(données, charset)
à la place.Cela dit: il a été très, très longtemps, depuis que j'ai vu de vraies données ASCII en environnement de production
Réduit de moitié la performance? Quelle est la taille de ce tableau d'octets? Si c'est par exemple de 1 mo, alors il y a certainement plus de facteurs à prendre en compte que juste "conversion" d'octets pour les caractères (qui est censé être assez rapide tout de même). Écrit 1 MO de données au lieu de "juste" 100bytes (qui le
byte[].toString()
peut générer) dans un fichier journal est évidemment va prendre un certain temps. Le système de fichier du disque n'est pas aussi rapide que la mémoire RAM.Vous aurez besoin de changer la chaîne de la représentation du tableau d'octets. Peut-être avec un peu plus de renseignements sensibles, par exemple, le nom qui lui est associé (nom de fichier?), sa longueur et ainsi de suite. Après tout, quel est le tableau d'octets fait représenter?
Modifier: je ne me souviens pas d'avoir vu le "environ 30us" phrase dans votre question, peut-être que vous l'avez édité en moins de 5 minutes après la pose, mais c'est en fait microoptimization et certainement pas la cause "de moitié de la performance" en général. À moins que vous les écrivez un million de fois par seconde (encore alors, pourquoi voudriez-vous faire cela? n'êtes-vous pas trop le phénomène de la "journalisation"?).
Prendre un coup d'oeil ici: Plus rapide de la nouvelle Chaîne de caractères(octets, cs/csn) et de la Chaîne.getBytes(cs/csn)