Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows上本机加密哈希的本机实现比.Net托管版本快多少?_.net_Performance_Md5_Native_Sha - Fatal编程技术网

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

Windows上本机加密哈希的本机实现比.Net托管版本快多少?,.net,performance,md5,native,sha,.net,Performance,Md5,Native,Sha,我为数据集提供散列,以便对数据进行指纹识别并通过散列进行识别——这是SHA1和MD5等快速散列的核心用例 在.Net中,有一个选项可以使用其中一些哈希的本机或托管实现(无论如何,SHA变体)。我正在寻找一个MD5托管的实现,而在.Net Framework中似乎没有,但我想知道包装的本机CSP是否更快,我是否应该只使用它来确保使用它不会出现性能问题。最上面的答案表明,更快的性能可能是不存在托管变体的原因 这是真的吗?如果是,本机CSP的速度有多快?不幸的是,MD5-MD5CryptoServic

我为数据集提供散列,以便对数据进行指纹识别并通过散列进行识别——这是SHA1和MD5等快速散列的核心用例

在.Net中,有一个选项可以使用其中一些哈希的本机或托管实现(无论如何,SHA变体)。我正在寻找一个MD5托管的实现,而在.Net Framework中似乎没有,但我想知道包装的本机CSP是否更快,我是否应该只使用它来确保使用它不会出现性能问题。最上面的答案表明,更快的性能可能是不存在托管变体的原因


这是真的吗?如果是,本机CSP的速度有多快?

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

使用,我构建了一个()来度量两个实现之间的性能差异。而对于小型数据阵列,差异可以忽略不计,正如预期的那样,在16kB左右,本机实现开始显示潜在的显著延迟(毫秒级)。这看起来可能不多,但它比纯托管实现慢几个数量级。随着被散列数据大小的增加,这种差异会保持不变,在最大的测试数据数组(约250MB)中,CPU时间的差异约为8.5秒。考虑到像这样的散列通常用于对非常大的文件进行指纹识别,这种额外的延迟将变得明显,即使在I/O延迟通常大得多的情况下也是如此

由于没有执行纯本机测试(无需包装CSP和在托管代码中使用),但考虑到日志规模上图形的形状几乎相同,因此延迟的来源并不十分清楚,托管实现和本机实现似乎具有相同的内在性能,但本机代码的性能“转移”了,这可能是由于运行时本机代码和托管代码之间的互操作成本造成的。这个

除了回答这个特定案例中的“本机实现的速度有多快”这个问题外,我希望这一证据能够在出现本机与托管的问题时起到作用,打破对类似问题的长期有害反应,即本机代码总是更快,因此,不知何故,更好。托管代码显然非常快,即使在批量数据散列这一性能敏感的领域中也是如此


MD5的MS实现很糟糕,至少对于短字符串来说是如此。我通过调用OpenSSL获得了10倍的加速。很高兴听到这个消息,因为我对测试OpenSSL实现感兴趣。小广告:如果你想要一个防冲突(既不是MD5也不是SHA-1)快速哈希函数来识别文件,那么你可以考虑BLAKE2。它是为这种情况设计的。但是你需要一个本地库来获得最大的性能。酷,我来看看。我使用Murruer3跟踪一些内部数据的状态,但是Blake2看起来很有趣,特别是考虑到已发布的建议。
向下“移动”
,但在对数空间中,对应于常数因子速度差。因此,它可能是一个糟糕的本机实现。如果做得好,本机应该在大数据上胜过托管。是的,这就是我提出的观点:“看来托管实现和本机实现具有相同的内在性能”。但是为什么本机代码会有更高的性能呢?如果您分析抖动输出并避免GC收集暂停,您将获得大致相同的性能,除非您专门针对CLR抖动没有的硬件指令/寄存器。托管代码的速度慢不仅仅是因为神奇的原因,对于性能敏感的代码来说,有一些特定的事情可以避免。我不同意托管代码和本机代码具有相同的内在性能,数据就是证据。这些数据是在高数据量下防止PInvoke开销的证据,因为PInvoke调用的频率应该接近零。NET JIT总体上相当差。一个好的C编译器可以轻而易举地超越它。我已经详细研究了托管代码gen,它在许多方面都令人失望。作为一个实际的例子,托管JIT最近才获得了对旋转指令的支持(这个还没有发布)。RyuJit已经更好了,开源应该会对它有很大帮助(希望如此)。而且,是的,当我们努力优化本机生成的代码时,不难做到更好。但我想说的是,这并不神奇。这不像仅仅因为代码是本地的,它总是更快更好,这是我在与其他开发人员交谈时发现的信念。两者都可以很快,速度需要努力。是的,托管代码从性能劣势开始,抖动限制了它,但它最终可以变得很快。我在50个测试中详细比较了旧JIT和RyuJIT,并比较了代码。除了极少数地方外,龙井的情况更糟。循环中的范围检查是最大的改进。;当然,JIT可以做得相当或更好。热点JVM是惊人的。.NET JIT很差,这似乎与设计一样…:(