在Windows上本机加密哈希的本机实现比.Net托管版本快多少?

cod*_*zen 9 .net performance md5 native sha

我为数据集提供哈希以指纹数据并通过哈希识别它 - 这是快速哈希(如SHA1和MD5)的核心用例.

在.Net中,可以选择使用其中一些哈希的本机或托管实现(无论如何都是SHA变体).我正在寻找一个MD5托管实现,并且.Net Framework中似乎没有.但是想知道包装的原生CSP是否更快,如果我应该只使用它内容那么就没有了使用它的问题.对于为什么.NET框架中没有托管MD5实现的最佳答案表示更快的性能可能是托管变体不存在的原因.

这是真的,如果是这样,原生CSP的速度有多快?

cod*_*zen 19

不幸的是,MD5的包装本机CSP - MD5CryptoServiceProvider- 明显慢于纯托管实现.这是一个顽固的观点,认为本机代码明显比托管代码更快:在许多情况下,情况正好相反.这种情况至少在头对头测量中是这样的.

使用David Anson翻译参考MD5实现,我构建了一个快速性能测试(源代码),旨在测量两个实现之间性能的任何巨大差异.而对于小数据阵列,差异可以忽略不计,正如预期的那样,在16kB左右,本机实现开始显示可能显着的延迟 - 大约为毫秒.这可能看起来不多,但它比纯托管实现慢几个数量级.随着被散列数据的大小增加,这种差异得以保持,并且在最大的测试数据阵列 - 约250MB - CPU时间的差异大约是8.5秒.考虑到像这样的散列通常用于指纹非常大的文件,这种额外的延迟会变得明显,即使对于I/O通常更大的延迟也是如此.

延迟来自哪里并不十分清楚,因为没有执行纯粹的原生测试(一个可以省去CSP的包装并在托管代码中消耗),但考虑到对数刻度上的图形几乎相同,这样看来,在管理和本地实现具有相同的内在性能,但本地代码的性能在性能上可能是由于在运行时本机和托管代码之间互操作的成本"转移"了下来.此包裹天然CSP和纯管理实现之间的性能差异也被再现和其他研究者记录.

除了在这个特殊情况下回答"原生实施的速度有多快"这个问题之外,我希望这个证据可以在原生与管理问题出现时提供更多反思和调查,打破长期存在的恶性反应.类似的问题,本机代码总是更快,因此,不知何故,更好.托管代码显然非常快,即使在这个性能敏感的批量数据散列域中也是如此.

MD5哈希计算时间 MD5哈希计算时间(对数)

  • 好吧,我不同意托管和本地具有相同的内在性能,数据就是证据.数据是高数据大小的*PInvoke开销的证据*因为PInvoke调用的频率应接近零..NET JIT一般都很差.一个好的C编译器可以轻松超越它.我已经详细调查了托管代码gen,并且在很多方面令人失望.作为一个实际例子,托管JIT最近才获得对轮换指令的支持(这尚未发布). (2认同)