charAt () ou sous-chaîne? Lequel est plus vite?
Je veux aller à travers chaque caractère dans une Chaîne et passer chaque caractère de la Chaîne comme une Chaîne de caractères à une autre fonction.
String s = "abcdefg";
for(int i = 0; i < s.length(); i++){
newFunction(s.substring(i, i+1));}
ou
String s = "abcdefg";
for(int i = 0; i < s.length(); i++){
newFunction(Character.toString(s.charAt(i)));}
Le résultat final doit être une Chaîne de caractères. Donc, toute idée qui sera plus rapide ou plus efficace?
source d'informationauteur estacado
Vous devez vous connecter pour publier un commentaire.
Comme d'habitude: il n'a pas d'importance, mais si vous insistez sur le temps passé sur la micro-optimisation, ou si vous aimez vraiment à optimiser pour votre très spécial de cas d'utilisation, essayez ceci:
La réponse est: il n'a pas d'importance.
Le profil de votre code. C'est votre goulot d'étranglement?
Ne
newFunction
vraiment besoin de prendre uneString
? Il serait mieux si vous pouviez fairenewFunction
prendre unchar
et de l'appeler comme ceci:De cette façon, vous éviter de créer une Chaîne temporaire de l'objet.
Pour répondre à votre question: Il est difficile de dire lequel est le plus efficace. Dans les deux exemples, un
String
objet doit être créé qui contient un seul caractère. Ce qui est plus efficace dépend de la façon dont exactementString.substring(...)
etCharacter.toString(...)
sont mis en place sur votre Java particulier de mise en œuvre. La seule façon de le découvrir est de l'exécution de votre programme grâce à un générateur de profils et de voir quelle version utilise plus de CPU et/ou plus de mémoire. Normalement, vous ne devriez pas vous soucier de micro-optimisations comme cela - seulement passer du temps sur ce quand vous avez découvert que c'est la cause d'un rendement et/ou de problème de mémoire.Des deux extraits de code que vous avez posté, je ne veux pas dire. Je serai d'accord avec vous que c'est presque certainement est sans importance dans la performance globale de votre code - et si elle ne l'est pas, vous pouvez simplement faire le changement et déterminer vous-même ce qui est le plus rapide pour vos données avec votre JVM sur votre matériel.
Cela dit, il est probable que le deuxième extrait de code serait mieux si vous avez converti la Chaîne dans un tableau de char d'abord, et ensuite d'effectuer votre itérations sur le tableau. Cette façon de faire permettrait d'effectuer la Chaîne généraux une seule fois (la conversion dans le tableau) à la place de chaque appel. En outre, vous pouvez ensuite passer le tableau directement à la Chaîne constructeur avec quelques indices, qui est plus efficace que de prendre un char hors d'un tableau de passer individuellement (qui est ensuite transformé en un tableau de caractères):
Mais pour renforcer mon premier point, quand vous regardez ce que vous êtes réellement en évitant à chaque appel de
String.charAt()
- c'est deux limites des contrôles, un (paresseux) OU booléen, et une addition. Cela ne va pas faire aucune différence notable. Ni est la différence dans la Chaîne des constructeurs.Essentiellement, les deux idiomes sont bien en termes de performances (ni est immédiatement évidemment inefficace) de sorte que vous ne devriez pas dépenser plus de temps de travail, sauf si un générateur de profils montre que cela prend une grande quantité de votre application d'exécution. Et même alors, vous pouvez presque certainement obtenir plus de gains de performance par la restructuration de votre code de prise en charge dans ce domaine (par exemple
newFunction
prendre l'ensemble de la chaîne elle-même); java.lang.La chaîne est assez bien optimisé en ce point.Je voudrais d'abord obtenir le sous-jacent char[] de la Chaîne source à l'aide de la Chaîne.toCharArray() et ensuite procéder à l'appel newFunction.
Mais je suis d'accord avec Jesper qu'il serait mieux si vous pouviez juste de traiter avec des personnages et d'éviter toutes les fonctions de Chaîne...