2009-12-07 4 views
0

J'ai profilé mon application avec des Ants et ai découvert que> 10% est dans les calculs CRC32. (Le CRC32-calcul est fait en C# ordinaire)Calcul rapide de crc32 C#:

Je l'ai fait quelques recherches sur Google et appris sur les valeurs intrinsèques suivantes dans Visual Studio 2008:

_mm_crc32_u8

_mm_crc32_u16

_mm_crc32_u32

_mm_crc32_u64

(http://msdn.microsoft.com/en-us/library/bb514036.aspx)

Quelqu'un peut-il me dire/me montrer comment les utiliser pour remplacer mon homebrew CRC32?

+0

Notez que ce sont des intrinsèques C++, pas C#. – MSalters

Répondre

0

Vous pouvez utiliser PInvoke (et pur C#) ou créer le projet C++/CLI et écrire wrapper autour de cette fonction.

Avez-vous vu un exemple sur msdn? Pour calculer le CRC de la chaîne, il vous suffit de la parcourir.

Eh bien, ce sont des fonctions intrinsèques. Cela signifie que vous n'avez qu'une seule option: créer un wrapper C++/CLI.

1

Il y a quelques années, je que j'ai trouvé sur CodeProject. Maintenant je ne peux plus le trouver. Mais un coup d'oeil aussi très rapide:

CRC32 on CodeProject

+1

C'est l'habituel Single-table-lookup avec 2 XOR, un ET et un changement que j'utilise pour le moment;) – Pygmy

2

Vous ne savez pas que vous devez utiliser ces méthodes pour remplacer votre bière maison. Trouvé une bonne mise en œuvre pour calculating CRC-32 in C# here.

2

A C# wrapper autour de cela pourrait être la meilleure solution pour les données actuellement de bonne taille.

http://code.google.com/p/crcutil/

bibliothèque Crcutil fournit la mise en œuvre efficace des algorithmes CRC. Il comprend la mise en œuvre de référence d'un nouvel algorithme CRC Multiword inventé par Andrew Kadatch et Bob Jenkins au début de 2007. Le nouvel algorithme est fortement orienté vers les processeurs modernes Intel et AMD et est sensiblement plus rapide que presque tous les autres algorithmes CRC.

CRC32C assistée par matériel: 0,13 cycles de CPU (Nehalem) par octet. CRC de 64 bits et moins: 1,0 (Nehalem) - 1,2 (cœur) cycles par octet. CRC de 128 bits: 1,7 cycles de processeur par octet.

L'AVX2 de Haswell peut apporter quelques instructions qui peuvent améliorer la perf, si c'est le cas, serait cool si elles étaient incluses dans cette bibliothèque.

+0

Bien que ce soit assez intéressant, il ne répond pas à la question "comment remplacer Pygmys homebrewed CRC32 algos" . Expliquer comment faire pour envelopper la bibliothèque mentionnée. Ne peut pas +1 car ce n'est pas une réponse valide. –