Niestety, owinięta natywna CSP dla MD5 - MD5CryptoServiceProvider
- jest znacznie wolniejsza niż czysto zarządzana implementacja. Jest to uparty punkt widzenia, który utrzymuje, że natywny kod jest jednoznacznie szybszy niż kod zarządzany: w wielu przypadkach jest odwrotnie. To jest taki przypadek, przynajmniej w pomiarze "głowa-głowa".
Korzystając z translated reference MD5 implementation by David Anson, skonstruowałem model quick performance test (source), który ma na celu pomiar dużych różnic w wydajności między dwiema implementacjami. Podczas gdy dla małych macierzy danych różnica jest znikoma, zgodnie z oczekiwaniami, przy około 16kB natywna implementacja zaczyna wykazywać potencjalnie znaczne opóźnienie - rzędu milisekund. To może nie wydawać się dużo, ale jest to rząd wielkości wolniejszy niż czysto zarządzana implementacja. Różnica ta jest utrzymywana w miarę wzrostu wielkości mieszanych danych, a przy największej badanej tablicy danych - ~ 250 MB - różnica czasu procesora wynosiła około 8,5 sekundy. Biorąc pod uwagę, że taki skrót jest często używany do pobierania bardzo dużych plików odcisków palców, to dodatkowe opóźnienie staje się zauważalne, nawet w stosunku do często znacznie większych opóźnień z operacji we/wy.
Nie jest jasne, skąd pochodzi opóźnienie, ponieważ nie wykonano czystego natywnego testu (takiego, który zrezygnowałby z zawijania CSP i zużycia w zarządzanym kodzie), ale biorąc pod uwagę prawie identyczny kształt wykresów na według skali logu wydaje się, że implementacje zarządzane i natywne mają tę samą wewnętrzną wydajność, ale wydajność natywnego kodu jest "przesunięta" w dół w wydajności prawdopodobnie ze względu na koszt współdziałania kodu natywnego i zarządzanego w czasie wykonywania. To jest performance difference between wrapped native CSPs and pure managed implementations has also been reproduced and documented by other investigators.
Oprócz odpowiedzi na pytanie "o ile szybsza jest natywna implementacja" w tym konkretnym przypadku, mam nadzieję, że ten dowód będzie służył prompt more reflection and investigation, gdy pojawi się pytanie rodzimego kontra zarządzanego, łamiąc długotrwałą i szkodliwą reakcję na podobne pytania, że natywny kod jest zawsze szybszy, a więc w jakiś sposób lepszy. Kod zarządzany jest wyraźnie bardzo szybki, nawet w tej wrażliwej na wydajność domenie mieszania danych zbiorczych.
Wdrożenie MS MD5 bani, przynajmniej na krótkich łańcuchach. Zoptymalizowałem ~ 10 razy p/wywołując OpenSSL. – CodesInChaos
Miło mi to słyszeć, ponieważ byłem zainteresowany testowaniem implementacji OpenSSL. – codekaizen
Mała reklama: Jeśli chcesz odporny na kolizję (ani MD5, ani SHA-1), to szybka funkcja hash do identyfikacji plików, możesz rozważyć Blake2. Został zaprojektowany dla tego scenariusza. Ale potrzebujesz natywnej biblioteki dla maksymalnej wydajności. – CodesInChaos