不幸的是,MD5 的封装原生 CSPMD5CryptoServiceProvider
比纯托管实现慢得多。这是一个顽固的观点,认为本机代码明显比托管代码快:在许多情况下,情况恰恰相反。至少在头对头测量中就是这种情况。
使用David Anson 翻译的参考 MD5 实现,我构建了一个快速的性能测试(来源) 旨在衡量两种实现之间的性能差异。虽然对于小型数据阵列,差异可以忽略不计,正如预期的那样,在大约 16kB 时,本机实现开始显示潜在的显着延迟 - 大约为毫秒。这可能看起来不多,但它比纯托管实现慢几个数量级。随着被散列的数据大小的增加,这种差异保持不变,并且在最大的测试数据数组 - ~250MB - CPU 时间的差异约为 8.5 秒。考虑到像这样的哈希通常用于对非常大的文件进行指纹识别,这种额外的延迟会变得很明显,即使 I/O 的延迟通常要大得多。
目前还不清楚延迟来自何处,因为没有执行纯本机测试(这将免除 CSP 的包装和托管代码中的消耗),但考虑到对数刻度上的图形几乎相同的形状,看起来托管和本机实现具有相同的内在性能,但本机代码性能可能由于运行时本机和托管代码之间的互操作成本而在性能上“下移”。封装的本地 CSP 和纯托管实现之间的这种性能差异也已被其他调查人员复制和记录。
除了在这个特殊的案例中回答“原生实现速度快多少”这个问题之外,我希望这个证据能够在原生与托管的问题出现时引发更多的反思和调查,打破长期以来对类似的问题是原生代码总是更快,因此,不知何故,更好。托管代码显然非常快,即使在这个对性能敏感的批量数据散列领域也是如此。