Мне нужно сгенерировать несжимаемые данные (следовательно, псевдослучайные), и я пытался с кодом ниже. Но он производит только около 10 МБ / с данных. Мне нужно около 100-200 МБ / с. Есть ли у вас какие-либо советы?
if ($length > 8*1024*1024){ //Default max string length in php.
while (($length - $bytesGenerated)>8*1024*1024){
$bytesGenerated = $bytesGenerated + (8*1024*1024);
print(openssl_random_pseudo_bytes(8*1024*1024));
}
}
print(openssl_random_pseudo_bytes($length - $bytesGenerated));
если вы работаете под linux, вы можете просто прочитать из /dev/urandom, его ядра быстрый генератор псевдослучайных чисел.
с другой стороны, вы можете использовать openssl rand и передать его в php.
Это будет тяжело для PHP, даже с ускорителями. Я бы написал модуль C++ специально для этой функции (но даже на C++ это не очень просто).
При пиковой теоретической максимальной производительности на процессоре с тактовой частотой 3 ГГц (x86) у вас будет бюджет чуть менее 4 инструкций ЦП на случайный байт, если вы попытаетесь достичь скорости 200 МБ/с. Реальная производительность будет значительно ниже этой. Я бы сказал, что это будет чрезвычайно сложно на любом языке. Вы хорошо разбираетесь в скоростях, которые, как правило, используют выделенный аппаратный ускоритель (т. Е. Вы пытаетесь сделать 1,56 Гбит в секунду). В сетевых или видеоприложениях имеется значительное количество внешнего оборудования, предназначенного для обеспечения такой пропускной способности. Чрезвычайно эффективная реализация на C или ассемблере может позволить вам обойти это ограничение, но на самом деле вы достигаете пределов возможного, используя только аппаратное обеспечение общего назначения.
Я бы рассмотрел либо предварительную генерацию данных (как уже было предложено), либо использование какого-либо аппаратного криптоускорителя, чтобы достичь чего-либо, похожего на такие пропускные способности. Я нашел этот список поставщиков оборудования для криптоускорителей.
Напоследок, вы ведь имели в виду 200 мегабайт в секунду, верно? Если вы имели в виду мегабит, то эта проблема решается гораздо проще.
Вам нужны криптографически безопасные псевдослучайные числа? В противном случае вы можете попытаться реализовать Сдвиговый регистр с линейной обратной связью