C# C快速crc32计算:

C# C快速crc32计算:,c#,performance,crc32,intrinsics,C#,Performance,Crc32,Intrinsics,我用Ants分析了我的应用程序,发现CRC32计算中大于10%。 CRC32计算在普通C中完成 我在Visual Studio 2008中通过谷歌搜索了解了以下本质: _mm_crc32_u8 _mm_crc32_u16 _mm_crc32_u32 _mm_crc32_u64 有人能告诉我/演示如何使用这些来取代我的自制CRC32吗?您可以使用PInvoke和纯c,或者创建c++/CLI项目并围绕这些函数编写包装器 你们看到msdn上的例子了吗?要计算字符串的CRC,只需循环遍历它 它们是内在

我用Ants分析了我的应用程序,发现CRC32计算中大于10%。 CRC32计算在普通C中完成

我在Visual Studio 2008中通过谷歌搜索了解了以下本质:

_mm_crc32_u8

_mm_crc32_u16

_mm_crc32_u32

_mm_crc32_u64


有人能告诉我/演示如何使用这些来取代我的自制CRC32吗?

您可以使用PInvoke和纯c,或者创建c++/CLI项目并围绕这些函数编写包装器

你们看到msdn上的例子了吗?要计算字符串的CRC,只需循环遍历它


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

不确定是否必须使用这些方法来替换您的自制brew。找到了一个很好的实现。

围绕它的C包装器可能是目前用于适当大小数据的最佳解决方案

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可能会带来一些指令,这些指令可能会进一步提高性能,如果是这样的话,如果它们包含在这个库中,那就太酷了。

CRC32的计算速度近年来越来越快。部分原因是实现优化,但也由于新的处理器指令变得可用。因此,这个新的答案几乎有十年之久的问题

概述了最近一次更新日期为2016年的优化。是一个2019 C实现的快速C++ CRC32算法SLIN BLUME和BRAT ZigaSin。他声称他的版本比本土CLI C++快速CRC32实现略慢10%左右。该算法是旧的CRC-32-IEEE算法

如果你有能力选择另一个变体,那么就选择。这在Crc32C.NET包中提供

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

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

这个库包含托管代码的优化,所以,它确实是 比其他Crc32实现更快。如果您确实需要Crc32, 这个图书馆是最好的选择。对该实现进行了调查 从不同的变体中选择最快的。此外,它对x64和 x86,因此,似乎没有必要进行两种不同的实现

对于经典的CRC-32-IEEE算法,我不知道上面两个.NET实现中哪一个是最快的。不引用第一个实现

Anonymous Coward的答案指向一种高性能CRC参考实现,它是Andrew Kadatch和Bob Jenkins在2007年初发明的一种新型多字CRC算法的实现。新算法主要针对现代Intel和AMD处理器进行调整,并且比几乎所有其他软件CRC算法都要快。他们2010年的论文在下载列表中列出。本文介绍了一些可用于避免重新处理某些数据范围的技巧:

增量CRC计算 更改初始CRC值 crc的级联 就地修改CRC ed消息 在消息之后存储CRC值
因此,当数据量变得足够大或环境有限时,要努力计算需要的东西。

注意,这些是C++内部的,而不是C。注意到x86 CRC指令使用CRC32 C多项式,例如iSCSI和一些文件系统,而不是经典的CRC32以太网、GZIP、BZIP2等。CRC32C可能是任何新用例的最佳选择,因为它往往具有更好的CPU加速支持。虽然这很有趣,但它并没有回答如何取代俾格米人自制的CRC32算法的问题。解释如何包装所提到的库将非常有用。不能+1,因为这不是一个有效的答案。更明确地说,x86 CRC指令只会加速CRC32C。您的一句话是这样说的,但这是支持它在x86上运行的软件中使用的一个重要原因。不过,您的答案并不清楚这些.NET库是否真的利用了可用的x86 CRC指令。你从谈论位切片开始,如果你 可以将数据以8字节块的形式提供给CRC指令。