8
votes

Java.lang.string.concat peut-il être amélioré?

Je envisage de soumettre une RFE (demande d'amélioration) à la base de données de bogues Oracle, qui est censée augmenter de manière significative les performances de la concaténation de chaînes. Mais avant de le faire, j'aimerais entendre les commentaires des experts sur la question de savoir si cela a du sens.

L'idée est basée sur le fait que la chaîne existante.ConCat (String) fonctionne deux fois plus rapidement sur 2 cordes que StringBuilder. Le problème est qu'il n'y a pas de méthode pour concaténer 3 cordes ou plus. Les méthodes externes ne peuvent pas faire cela parce que string.concat utilise un conducteur privé de paquet String (int offset, int comptage, char []) code> qui ne copie pas le tableau de caractères mais l'utilise directement. Cela garantit des performances élevées String.ConCat. Être dans le même paquet StringBuilder ne peut toujours pas utiliser ce constructeur car le tableau de caractères de la chaîne sera exposé pour des modifications. p>

Je suggère d'ajouter les méthodes suivantes à la chaîne p> xxx pré>

Remarque: Ce type de surcharge est utilisé dans Enumset.of, pour une efficacité. P >

Il s'agit de la mise en œuvre de l'une des méthodes, d'autres fonctionnent de la même manière p> xxx pré>

également, après que ces méthodes sont ajoutées à la chaîne, Java compilateur pour P > xxx pré>

sera capable de construire efficacement p> xxx pré>

au lieu de courant inefficace actuel p> xxx pré> mise à jour strong> test de performance. Je l'ai couru sur mon cahier Intel Celeron 925, concaténation de 3 chaînes, ma classe String2 émule exactement comment ce serait dans de vrais java.lang.string. Les longueurs de chaîne sont choisies de manière à mettre de manière à mettre StringBuilder dans les conditions les plus défavorables, c'est-à-dire lorsque cela doit élargir sa capacité de tampon interne à chaque annexe, tandis que Concat crée toujours une autre une fois. P>

version 1 = ~200 ms
version 2 = ~400 ms


1 commentaires

Tampon de cordes peut être beaucoup plus rapide que vous ne voulez atteindre


3 Réponses :


4
votes

Si vous voulez qu'ils vous prennent au sérieux, vous devez faire le travail acharné de la mise en œuvre, de tester et d'analyser minutieusement votre changement proposé. Et une implémentation complète inclurait les modifications apportées au compilateur Java pour émettre des byTecodes pour utiliser vos méthodes.

Écrivez les résultats, puis soumettez ensuite les modifications du code sous forme de patch à OpenJDK 7 ou 8.

Mon impression est que les développeurs Java n'ont pas les ressources nécessaires pour essayer des idées spéculatives pour des optimisations comme celle-ci. Une RFE sans résultats d'analyse comparative et des correctifs de code est peu susceptible de recevoir une attention ...


1 commentaires

Droite, j'ai déjà essayé de soumettre des bugs (ou ce que je pense être des bogues) à la base de données de bugs. À l'instar d'une seule tentative, la bogue Javadoc de DEQUE, a succédé à Bugs.sun.com.com /bugdatabase/view_bug.do?bug_id=7178639 . Que l'on était impossible de rejeter



7
votes

Le fait est que les cas d'utilisation pour lesquels la performance d'une seule expression de concaténation à chaîne ne concerne pas ce qui est commun. Dans la plupart des cas où la performance est liée par la concaténation à la chaîne, elle se produit dans une boucle, construisant l'étape du produit final par étape et dans ce contexte, le StringBuilder est un gagnant clair. C'est pourquoi je ne vois pas beaucoup de perspective pour une proposition qui optimise une préoccupation minoritaire en intervenant dans la catégorie fondamentale string . Mais de toute façon, en ce qui concerne la comparaison des performances, votre approche a un avantage important: xxx

résultat: xxx


1 commentaires

Merci beaucoup. Analysera et ajoutera quelques points de repère à mon post.



1
votes

C'est toujours correct de leur demander, ne vous inquiétez pas.

Je n'aurais pas autant de versions surchargées. En énumble, la sauvegarde peut être significative; pas probablement donc dans la chaîne.

En fait, je pense qu'une méthode statique permettant à un nombre quelconque de SAR args est meilleure xxx

puisque le nombre d'args peut être inconnu à Compiler l'heure.


2 commentaires

L'idée de plusieurs méthodes surchargées appartient à Josh Bloch, elle "évite le coût de l'allocation de la matrice si moins de n args". C'est à dire. Joindre ("1", "2") signifie efficacement Joindre (nouvelle chaîne [] {"1", "2"}), une matrice supplémentaire est créée. Étant donné que l'ensemble du sujet concerne la performance, cet idiome de Josh Block semble être pertinent.


En énumble, les arguments sont des atomes simples. Dans la chaîne, les arguments doivent être copiés, de sorte que les frais généraux de Vararg sont relativement négligeables.