Question

Je suis en train d'écrire des fonctions de hachage pour un compilateur et j'utiliser le type de __int64 fréquemment. Le compilateur est destiné à être pris en charge (et à ce jour est) sur les différents systèmes d'exploitation à. Je sais que __int64 est un type qui peut être compilé par la plupart des compilateurs C ++ pour mes systèmes cibles afin que n'est pas le problème. J'utilise des fonctions de hachage pour faire de grandes chaînes de caractères plus petits et plus rapides à comparer et ils font des merveilles sur 64 bits capable OS de; mais y aurait-il une assez grande diminution de la performance sur 32 bit OS de annuler les avantages? Je pourrais utiliser des entiers 32 bits, mais il réduirait considérablement l'efficacité des fonctions de hachage.

Edit: Il est un code personnalisé et très simple. La première fonction de hachage génère un int 64 bits unique de 12 caractères alphanumériques (y compris soulignement) caractères. Ensuite, une poignées de classe hash plus de 12 caractères en créant des listes chaînées adresse-de hash 64bit et les opérateurs de surcharges comparaison. La surcharge sont courts compare circuité et comparer la liste liée adresse. J'ai tests ran sur ma machine à comparer la vitesse de générer au hasard un grand hash (100 - 300 caractères) par rapport à eux-mêmes (cas le plus défavorable senario) et il est avéré être plus rapide que la chaîne compare. Afin de mieux simuler les frais généraux de la génération hash, j'ai aussi fait des tests de comparer les grandes hash pré-générés eux-mêmes contre compare. Tout cela est en marche avec l'optimisation de code désactivé. Avec ~ 1 milliard de hachage compare chaîne par rapport ~ 1 milliard compare, le hachage a environ 16% du temps. C'était dans un environnement 64 cependant. Je n'ai pas une machine 32 bits pour exécuter des tests avec

Était-ce utile?

La solution

64bit entiers de taille ne sont pas du tout beaucoup plus lent sur une architecture x86 32 bits. Ils ne sont pas aussi vite que 32bit ints, évidemment, mais ne sont pas beaucoup plus lents. Ce n'est pas du tout téméraire d'utiliser un 64bit int pour hash quel que soit x86 ou x64. Les frais généraux supplémentaires sera probablement minime par rapport à-dire deux des allocations dynamiques non nécessaires ou algorithmes ont échoué.

Autres conseils

Je ne pense pas que la comparaison de quatre variables 32 bits sera plus rapide que de comparer deux variables 64 bits, car je suppose que le compilateur va générer le code le plus rapide: si votre processeur ne prend pas en charge les opérations 64 bits, votre compilateur génère du code qui compare en deux étapes, tout comme vous le feriez à la main.
Cela dépend bien sûr de votre compilateur.


Quoi qu'il en soit, il existe d'autres outils qui rendront vos comparaisons encore plus rapide, mais qui ne sont pas disponibles partout, par exemple les opérations vectorielles (fournies par les extensions SSE) qui permettent de comparer même 8 * 4 octets à la fois.

Si vous avez besoin d'optimiser votre code, autant que possible, je vous suggère d'ajouter quelques directives de préprocesseur afin d'activer les optimisations que lorsque les supports du système eux.

Êtes-vous sûr qu'il réduirait considérablement l'efficacité de la fonction de hachage? Avez-vous d'exécuter des tests? Certes 64 bits est un meilleur hachage de 32 bits si (i) le nombre d'éléments hachés est sensiblement supérieure à 2 ^ 16 et (ii) le calcul du hachage de 64 bits est pas cher. Laquelle de (i) ou (ii) (ou les deux) est vrai dans votre cas? Si la performance est importante, vous voudrez peut-être utiliser différentes fonctions de hachage en fonction du système d'exploitation sous-jacent. Sinon, je dirais: écrire une version 32 bits et une version 64 bits; essayer les deux sur un système 64 bits, et un système 32 bits; et vous verrez si ça vaut busting un intestin plus.

Toutes les fonctions de hachage que je l'ai utilisé le retour de la valeur dans un tableau d'octets (uchar) pour éviter votre problème.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top