6
votes

Pourquoi la méthode des getbytes de chaîne natif est-elle plus lente que la getByTesfast personnalisé implémentée?

Lors de l'exécution de la pièce de code suivante, l'exécution de la méthode natale de Java String Getbytes () forte> semble être plus lente forte> que la coutume getbytesfast () Mise en œuvre. Vous pouvez utiliser les tableaux .equaux (str.getbytes (), getBytesFast (str)) code> Pour vérifier que les deux tableaux d'octets sont égaux.

La mise en œuvre de GetByTesFast est une version modifiée de la mise en œuvre incluse dans Cet article (1997): http://java.sun.com/developer/ Technicalarticles / Programmation / Performance / P>

Je recherche une réponse bien documentée sur la raison pour laquelle la mise en œuvre native est plus lente que la mise en œuvre personnalisée. P>

package com.test;

public class Performance {

    public static void main(String args[]) {

        final String str = "This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test! This is a performance test!";

        long startTime_1 = System.nanoTime();
        str.getBytes();
        System.out.println(System.nanoTime() - startTime_1);

        long startTime_2 = System.nanoTime();
        getBytesFast(str);
        System.out.println(System.nanoTime() - startTime_2);
    }

    private static byte[] getBytesFast(String str) {
        final char buffer[] = new char[str.length()];
        final int length = str.length();
        str.getChars(0, length, buffer, 0);
        final byte b[] = new byte[length];
        for (int j = 0; j < length; j++)
            b[j] = (byte) buffer[j];
        return b;
    }
}


13 commentaires

Une seule exécution d'exécution n'est pas un moyen approprié de mesurer les performances. De nombreux facteurs externes peuvent modifier le résultat.


Comment puis-je écrire une micro-repère correcte en Java?


J'étais curieux, alors j'ai copié votre code et je l'ai envoyé dans Eclipse moi-même et il en résulte 1 pour les deux méthodes, votre test n'est donc certainement pas concluant.


La raison est expliquée dans l'article, , qui est datée de 1997, et indique également qu'il s'agit de la conversion incorrecte de l'octet.


Votre méthode getBytesFast échouerait probablement si votre chaîne de test comprenait des caractères de l'extérieur du bloc latin-1. (Par exemple, essayez-le d'une lettre grecque α ("\ u03b1") dans la chaîne.


Merci à tous pour vos précieux commentaires.


Les implémentations personnalisées sont souvent plus rapides que celles construites car a) Vous pouvez ou avez fait beaucoup d'hypothèses que les bibliothèques intégrées ne peuvent pas. b) Certaines des bibliothèques ont été écrites il y a de temps et ne peuvent pas être "améliorées" comme cela pourrait changer leur comportement.


Juste pour les personnes qui sont curieuses de la façon dont cela ressemble à une référence d'étrier: microbenchmarks.appot.com/run/fabian.barney@gmail.com/...


Le poste a été mis à jour avec les résultats de référence d'étrier, que Fabiancarney a affiché. @Fabianbarney: merci


La conclusion n'est pas valide. Qu'est-ce qui va bien ou faux ici ne concerne pas la convertion entre les codages de caractères. Cela dépend de ce que les points de code sont utilisés si votre méthode produit le résultat correct ou non.


@FabianBarney: J'ai supprimé le mot "conclusion", indiquant que c'est mon opinion personnelle. Merci


C'est sur votre avis s'il est admissible à utiliser la version plus rapide avec son avantage rapide, mais également des descentes ou non. Mais le texte que vous avez écrit sur la conversion entre les codages de caractères reste tout simplement faux. Tout cela n'a rien à voir avec la convertion entre les codages de char. Il s'agit d'une représentation des octets d'octets de cordes et de points de code utilisés et tels.


@Fabianbarney Chaque personnage peut être représenté différemment selon le schéma d'encodage utilisé. C'est pourquoi l'opération GetBytes (Charset) nécessite un "CharsetName" afin de convertir les caractères de chaîne. Je voulais donc dire que si le schéma de codage est important, les getbytes de chaîne (Charset) et le cadre NIO doivent être utilisés. Peut-être que je n'ai pas bien expressé.


3 Réponses :


4
votes

Ce peut être parce que string.getbytes () Utilisations ou délégués à un Charset (l'une de la valeur par défaut de la JVM) et de votre implémentation "rapide" est simplement codée en dur ISO-8859-1 Charset.

(Remarque: je n'ai pas vérifié vos résultats, je déclare simplement ma hipothèse ici. Les commentaires relatives aux micro-repères sont plus importants ici, et certainement plus précieux que ma réponse à votre question :)


0 commentaires

12
votes

chaîne .betbytes code> prend en compte la branchée par défaut du système. Votre implémentation suppose ISO-8859-1 .

string. Les getBytes code> finissent par appeller cette méthode. CE CODE> est un CHRSTECODER CODE> . P>

byte[] encode(char[] ca, int off, int len) {
        int en = scale(len, ce.maxBytesPerChar());
        byte[] ba = new byte[en];
        if (len == 0)
            return ba;
        if (ce instanceof ArrayEncoder) {
            int blen = ((ArrayEncoder)ce).encode(ca, off, len, ba);
            return safeTrim(ba, blen, cs, isTrusted);
        } else {
            ce.reset();
            ByteBuffer bb = ByteBuffer.wrap(ba);
            CharBuffer cb = CharBuffer.wrap(ca, off, len);
            try {
                CoderResult cr = ce.encode(cb, bb, true);
                if (!cr.isUnderflow())
                    cr.throwException();
                cr = ce.flush(bb);
                if (!cr.isUnderflow())
                    cr.throwException();
            } catch (CharacterCodingException x) {
                // Substitution is always enabled,
                // so this shouldn't happen
                throw new Error(x);
            }
            return safeTrim(ba, bb.position(), cs, isTrusted);
        }
    }
}

private static int scale(int len, float expansionFactor) {
    // We need to perform double, not float, arithmetic; otherwise
    // we lose low order bits when len is larger than 2**24.
    return (int)(len * (double)expansionFactor);
}

private static char[] safeTrim(char[] ca, int len,
                               Charset cs, boolean isTrusted) {
    if (len == ca.length && (isTrusted || System.getSecurityManager() == null))
        return ca;
    else
        return Arrays.copyOf(ca, len);
}


0 commentaires

13
votes

Selon [la documentation], le type CHAR CODE> JAVA est un caractère Unicode 16 bits, alors que le type octet code> est un entier signé à 8 bits. Cela signifie que avec chaque char code> -à-- octet code> moulée faite dans votre code Vous jetez la moitié des données de caractères. Strong>

le didacticiel Java sur les flux de caractères et d'octets a un joli petit exemple de corde à l'aide de Kanji japonais:

String jaString = new String("\u65e5\u672c\u8a9e\u6587\u5b57\u5217");


0 commentaires