C#快速crc32计算:

时间:2009-12-07 09:48:40

标签: c# performance crc32 intrinsics

我用蚂蚁描述了我的应用程序并发现了> CRC32计算中有10%。 (CRC32计算在普通C#中完成)

我做了一些谷歌搜索并了解了Visual Studio 2008中的以下内在函数:

_mm_crc32_u8

_mm_crc32_u16

_mm_crc32_u32

_mm_crc32_u64

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

有谁能告诉我/告诉我如何使用这些来替换我自制的CRC32?

5 个答案:

答案 0 :(得分:2)

不确定是否必须使用这些方法来更换家用咖啡。找到了calculating CRC-32 in C# here的良好实现。

答案 1 :(得分:2)

围绕这个的C#包装器可能是目前正常尺寸数据的最佳解决方案。

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

Crcutil库提供CRC算法的有效实现。它包括由Andrew Kadatch和Bob Jenkins于2007年初发明的新型多字CRC算法的参考实现。新算法大量调整为现代Intel和AMD处理器,并且比几乎所有其他软件CRC算法快得多。

硬件辅助CRC32C:每字节0.13(Nehalem)CPU周期。 64位和更小的CRC:1.0(Nehalem) - 每个字节1.2(核心)CPU周期。 128位CRC:每个字节1.7个CPU周期。

Haswell的AVX2可能带来一些可能进一步提高性能的指令,如果是这样的话,如果它们包含在这个库中会很酷。

答案 2 :(得分:1)

几年前,我使用了我在codeproject上找到的一个。现在我再也找不到了。 但是这个看起来也非常快:

CRC32 on CodeProject

答案 3 :(得分:1)

多年来,CRC32的计算速度越来越快。部分是由于实现优化,也由于有新的处理器指令可用。因此,这个新答案回答了将近十年的老问题!

Stephan Brumme's CRC32 page概述了最后一个日期为2016的优化。FastCRC by Yuri Babich是Stephan Brumme和Bulat Ziganshin编写的快速C ++ CRC32算法“ Slicing-by-16”的2019 C#实现。他声称他的版本比本地CLI C ++快速CRC32实现慢一点(约10%)。该算法是较旧的CRC-32-IEEE。

如果您可以选择其他变体,请选择CRC-32C (Castagnoli)。在Crc32C.NET程序包中可用。

  

CRC-32C中的多项式具有更好的错误检测能力   属性,这就是它被新标准采用的原因   (iSCSI,SCTP,ext4)。除了更高的可靠性外,CRC-32C现在具有   专用指令在新型英特尔处理器上的优势。   这就是为什么它被选择用于高性能应用,   示例Snappy压缩算法。

Crc32.NET是RobertVažan对上述Crc32C.NET的.NET安全实现,但适用于Crc32算法。

  

该库包含托管代码的优化,因此,实际上   比其他Crc32实现更快。如果您确实需要Crc32,   这个库是最好的选择。已对该实现进行了调查   作为最快的不同变体。另外,对于x64和   x86似乎没有意义去做两种不同的实现。

我不知道上述两种.NET实现中哪一种是经典CRC-32-IEEE算法最快的。 performance comparison table没有引用第一个实现。

Anonymous Coward的答案指向crcutil,这是Andrew Kadatch和Bob Jenkins于2007年初发明的新型多字CRC算法的高性能CRC参考实现。该新算法在很大程度上针对现代的Intel和AMD处理器,并且比几乎所有其他软件CRC算法要快。他们的2010年论文Everything we know about CRC but afraid to forget在下载中列出。本文展示了一些技巧,可用于避免重新处理某些数据范围:

  • 增量CRC计算
  • 更改初始CRC值
  • CRC的串联
  • 就地修改CRC消息
  • 在消息后存储CRC值

因此,一旦数据量足够大或环境有限时,请尝试明智地计算哪些内容。

答案 4 :(得分:0)

您可以使用PInvoke(和纯c#)或创建C ++ / CLI项目并围绕此函数编写包装器。

你在msdn上看过例子吗?要计算字符串的CRC,你只需循环它。

嗯,它们是内在功能。这意味着您只有一个选项:创建C ++ / CLI包装器。