7
votes

Ce qui est plus rapide, une corde ou un entier comme hashkey en Java?

Je travaille sur un problème et j'ai un problème avec les temps d'exécution devenant trop grand et je cherche désormais des optimisations possibles.

La question: existe-t-il une différence (considérable) de performance entre utiliser une chaîne ou un entier comme hasard?

Le problème est que j'ai un graphique avec des nœuds stockés dans une hache avec une chaîne en tant que clé. Par exemple, les clés sont les suivantes: "0011" ou "1011", etc., je pourrais maintenant les convertir en entiers aswell si cela signifierait une amélioration du temps d'exécution.


2 commentaires

Le hashcode de chaîne est mis en cache de sorte qu'il ne devrait pas faire beaucoup de différence. Le problème est probablement ailleurs ... Vous devriez présenter votre code pour trouver le goulot d'étranglement. Remarque: dans une seule situation filetée, HASHMAP fonctionnera légèrement mieux que la haquetable.


Je vous suggère de profil de votre application et de voir quand il dépense la majeure partie de son temps. Il est très peu probable que la modification de l'heure clé de cette façon fasse une différence.


3 Réponses :


3
votes

Entier fonctionnera mieux que la chaîne. Voici le code du calcul de code HASHCODE pour les deux.

Implémentation de code de hachage entier P>

 /**
     * Returns a hash code for this string. The hash code for a
     * <code>String</code> object is computed as
     * <blockquote><pre>
     * s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
     * </pre></blockquote>
     * using <code>int</code> arithmetic, where <code>s[i]</code> is the
     * <i>i</i>th character of the string, <code>n</code> is the length of
     * the string, and <code>^</code> indicates exponentiation.
     * (The hash value of the empty string is zero.)
     *
     * @return  a hash code value for this object.
     */
    public int hashCode() {
    int h = hash;
    if (h == 0) {
        int off = offset;
        char val[] = value;
        int len = count;

            for (int i = 0; i < len; i++) {
                h = 31*h + val[off++];
            }
            hash = h;
        }
        return h;
    }


1 commentaires

Ce qui montre qu'à partir de la première fois, ils sont calculés, la performance est similaire.



1
votes

Il y a une différence de vitesse. Les hashmaps utiliseront HASHCODE pour calculer le godet sur la base de ce code et la mise en oeuvre d'entier est beaucoup plus simple que celle de la chaîne.

Cela dit, si vous rencontrez des problèmes d'exécution, vous devez effectuer des mesures correctes et vous profiler. C'est le seul moyen de savoir ce que le problème est avec le temps d'exécution et l'utilisation d'entiers au lieu de chaînes n'aura généralement qu'un effet minimal sur la performance, ce qui signifie que votre problème de performance pourrait être ailleurs.

Par exemple, regardez Ce message Si vous voulez faire des micro-repères appropriés. Il existe de nombreuses autres ressources disponibles pour le profilage, etc.


0 commentaires

2
votes

Si vous avez un problème de performance, il est tout à fait improbable que le problème soit dû au hashmap / hashtable. Alors que la chaîne de hachage est légèrement plus chère que les entiers hachage, c'est plutôt une faible différence, et le hashcode est mis en cache de sorte qu'il n'est pas recalculé si vous utilisez le même objet de chaîne, il est peu probable que vous obteniez une prestation de performance significative de la convertir entier.

Il est probablement plus fructueux de regarder ailleurs pour la source de votre problème de performance. Avez-vous essayé de profiler votre code encore?


0 commentaires