9
votes

Motif.split plus lent que string.split

Il existe deux méthodes: xxx

et je les teste comme celui-ci dans la méthode principale: xxx

intuitivement, je pense que String.Split Airez éventuellement Pattern.comPILE.Split (après beaucoup de travail supplémentaire) pour faire la vraie chose. Je peux construire l'objet modèle à l'avance (il est sûr de sécurité) et accélérez le fractionnement.

Mais le fait est, à l'aide du motif pré-construit est beaucoup plus lent que d'appeler string.split directement. J'ai essayé une chaîne de 50 caractères sur eux (en utilisant Myeclipse), l'appel direct ne consomme que la moitié du temps d'utilisation d'un objet de motif pré-construit.

S'il vous plaît quelqu'un peut-il me dire pourquoi cela se produit?


3 commentaires

Jetez un coup d'œil à la source. Il fait appelle motif.comple (regex) .split (ceci, limite) , mais uniquement si la chaîne à scinder est plus qu'un seul caractère. Au moins dans OpenJDK7, voir ici , ligne 2312 .


@Tobias_k drôle, vous êtes le seul à signaler ce détail crucial ... dans un commentaire, où tous les autres gens écrivent plutôt des réponses incomplètes.


Réponse lâchée - Stackoverflow.com/a/26159501/2182928


3 Réponses :


0
votes

Je pense que cela ne peut être expliqué que par l'optimisation JIT, String.Split en interne est implémenté comme suit:

    for (int i = 0; i < 300000; i++) {
        //base.split("\\.");// switch to patternSplit to see the difference
        //p.split(base);
        Pattern.compile("\\.").split(base, 0);
    }


0 commentaires

5
votes

Cela peut dépendre de la mise en œuvre réelle de Java. J'utilise OpenJDK 7, et ici, string.split invoque effectivement motif.comple (regex) .split (ceci, limite) , mais seulement si la chaîne à scinder par, regex , est plus qu'un seul caractère.

voir ici pour le code source, ligne 2312. xxx

comme vous le scindez par "\\." , il utilise le "chemin rapide". C'est-à-dire que si vous utilisez openjdk.


3 commentaires

Mais \\. est en fait une chaîne de deux caractères, je me trompe?


@ SP00M Voir le commentaire: "(2) Two-Char String et le premier caractère correspond au backslash et le second n'est pas la lettre ASCII DIGIT ou ASCII."


Ma faute, tu as raison, qui a été réellement mise en œuvre dans le groupe d'autres contrôles et beaucoup de code de bas niveau :)



2
votes

Ceci est la modification de string.split comportement, qui a été faite dans Java 7 . C'est ce que nous avoir dans 7u40 : xxx

et c'est ce que nous avait dans 6-b14 xxx


0 commentaires