我用蚂蚁描述了我的应用程序并发现了> 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?
答案 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上找到的一个。现在我再也找不到了。 但是这个看起来也非常快:
答案 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在下载中列出。本文展示了一些技巧,可用于避免重新处理某些数据范围:
因此,一旦数据量足够大或环境有限时,请尝试明智地计算哪些内容。
答案 4 :(得分:0)
您可以使用PInvoke(和纯c#)或创建C ++ / CLI项目并围绕此函数编写包装器。
你在msdn上看过例子吗?要计算字符串的CRC,你只需循环它。
嗯,它们是内在功能。这意味着您只有一个选项:创建C ++ / CLI包装器。