Пожалуйста, объясните, почему (как минимум в тестах на PascalABC.NET) код №1 работает быстрее ~ в 3 раза, чем код №2?
//№1
var
arr: array of byte;
rndg := new System.Security.Cryptography.RNGCryptoServiceProvider();
begin
setlength(arr, 10000000);
rndg.GetBytes(arr);
write(milliseconds());//от 50 до 70
end.
//№2
var
arr: array of byte;
rnd := new System.Random();
begin
setlength(arr, 10000000);
rnd.NextBytes(arr);
write(milliseconds);//от 160 до 200
end.
Почему генерация криптонадёжных (по документации .NET) случайных требует весомо меньших ресурсов времени, чем стандартных?
(при повышении длины массива до 100 млн элементов на криптослучайные тратится ~ 0,3 с, а на стандартные где-то 1,5 с)
(кстати: при тесте 1 млрд криптослучайных заметны весомые потери памяти, хотя всё оказалось вычислено за 41 с; при аналогичном тесте 1 млрд стандартно-случайных было потрачено 18 сек (ВНЕЗАПНО), а зависаний по тратам памяти особо не было (память не мерил, просто общее ощущение от самого "поведения" компа)).
Итого, меняю вопрос: просто прошу прокомментировать это поведение .NET'а (.NET'а ли???), по возможности объяснив его; в том числе интересен "излом" на 1 млрд байт.