Les performances entre la Chaîne.format et StringBuilder
Pour concaténer String
nous utilisons souvent StringBuilder
au lieu de String
+ String
, mais aussi, nous pouvons faire la même chose avec String.format
qui retourne une chaîne formatée par endroit donné, le format et les arguments.
Exemples:
Concaténer la chaîne avec StringBuilder
String concatenateStringWithStringBuilder(String name, String lName, String nick) {
final StringBuilder sb = new StringBuilder("Contact {");
sb.append(", name='").append(name)
.append(", lastName='").append(lName)
.append(", nickName='").append(nick)
.append('}');
return sb.toString();
}
Concaténer la chaîne avec StringFormat:
String concatenateStringWithStringFormat(String name, String lName, String nick) {
return String.format("Contact {name=%s, lastName=%s, nickName=%s}", name, lName, nick);
}
De performance, est String.Format
aussi efficace que StringBuilder
? Lequel est le mieux pour concaténer des chaînes et pourquoi?
Mise à JOUR
J'ai vérifié la même question, mais ne pas répondre à ma question. Jusqu'à présent j'ai utilisé StringBuilder
pour concaténer des chaînes, dois-je le suivre? Ou dois-je utiliser String.format
? la question est de savoir lequel est le mieux et pourquoi?
Double Possible de dois-je utiliser Java de la Chaîne.format() si la performance est-elle importante?
Une troisième option:
return "Contact {name=" + name + ", lastName=" + lName + ", nickName=" + nick + '}';
Ce serait de créer le même bytecode que d'utiliser StringBuilder et est tout aussi lisible que l'aide de la Chaîne.Format.voir ce dois-je utiliser Java de la Chaîne.format() si la performance est-elle importante?
À moins que votre méthode est appelée milliers de fois par seconde, vous ne remarquerez une différence dans la performance. Vous ne devez pas utiliser StringBuilder ou StringBuffer, tout simplement parce qu'ils sont beaucoup moins lisible. Je voudrais utiliser des chaînes de caractères.format, car il fait très clairement ce que votre chaîne finale est destiné à ressembler.
OriginalL'auteur JUAN CALVOPINA M | 2017-05-22
Vous devez vous connecter pour publier un commentaire.
Ce qui est "mieux" dépend uniquement de vos besoins:
Par exemple
String Builder
sera plus rapide, mais le code sera beaucoup plus illisible, et de et il serait plus facile de faire une erreur.D'autre part
String.format()
produit un code plus lisible, au détriment des performances.JMH référence pour illustrer la différence de performances (notez que la chaîne du générateur de code est plus long et très difficile de comprendre comment la chaîne résultante ressemblerait):
Et les résultats:
Pour non exécution de code critique, je préfère utiliser le
String.format()
, car il est plus facile et plus agréable à utiliser. Aussi, elle est visible en ce que la chaîne résultante ressemblerait, en regardant simplement le modèle. Si je suis en train de faire une critique pour les performances de code, ou quelque chose qui a avoir un faible impact GC, je voudrais utiliser uneStringBuilder
parce que c'est plus rapide et peut être réutilisé.Il suffit de lancer le "Lanceur" avec la classe de test nom en paramètre: github.com/SvetlinZarev/com.github.svetlinzarev.jmh.benchmarks/...
Merci @Svetlin. J'ai été en mesure d'exécuter d'autres JMH à partir de google. Mais merci bien.
OriginalL'auteur Svetlin Zarev
StringBuilder
est plus rapide, parce queString.format
doit analyser la chaîne de format (un complexe spécifique au domaine de la langue). Et c'est cher.BTW: C'est la même chose, car il en résulte le même code octet (depuis Java 1.5).
J'ai édité la réponse à la suppression de cette abréviation.
OriginalL'auteur G. Fiedler
Après avoir fait un petit test avec
StringBuilder
vsString.format
j'ai compris combien de temps il prend chacun d'entre eux pour résoudre la concaténation. Voici l'extrait de code et les résultatsCode:
Après d'exécuter le code plusieurs fois, j'ai vu que
String.format
prend plus de temps:Mais si j'exécute le même code à l'intérieur d'une boucle, le résultat du changement.
La première fois
String.format
s'exécute, il prend plus de temps, après que le temps est plus court, même si elle ne devient pas constante comme un résultat deStringBuilder
@G. Fiedler a dit: "
String.format
doit analyser la chaîne de format..."Avec ces résultats, il peut être dit que
StringBuilder
est plus efficace queString.format
String,concat
sur de longues et de courtes chaînes de caractèresIdée intéressante pour tester la boucle. Il semble que l'analyse de chaîne de formatage est mis en cache et réutilisés au lieu d'être analysé de nouveau à chaque itération de boucle. Aussi, il fait depuis que StringBuilder est plus lent sur les itérations de boucle, parce que vous êtes à l'instanciation d'un tout nouveau StringBuilder à chaque itération (en supposant que vous avez littéralement tout juste de terminer le même code avec une boucle).
OriginalL'auteur JUAN CALVOPINA M