2010-08-30 3 views
7

Мне нужно генерировать несжимаемые данные (поэтому псевдослучайные) и пытались с помощью кода ниже. Но это всего лишь около 10 МБ/с данных. Мне нужно около 100-200 МБ/с. У вас есть совет?Генерировать быстрые псевдослучайные данные в PHP

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)); 
+4

Могу ли я спросить, почему вам нужно так много случайных данных, которые генерируются «на лету» (как в том, почему вы не можете предварительно создать его, а затем передать его)? – ircmaxell

ответ

5

, если вы работаете под Linux, вы можете просто прочитать из/Dev/urandom, его ядер быстро псевдослучайного генератора.

с другой стороны вы можете использовать openssl rand и pipe, что в php.

+0

Уверен, что он может дать вам 200 Мбит/с? Я проголосую за 10-20Mv/sec max) – BarsMonster

+0

Что касается скорости/dev/urandom, то быстрый google говорит мне, что я должен ожидать по крайней мере 20 МБ/с –

+0

Google сказал мне, что это 3,5 Мбит/сек :-) dd if =/dev/urandom of = foo bs = 1M count = 100000 100000 + 0 записей в 100000 + 0 записей 104857600000 байт (105 ГБ) скопировано, 30104,4 с, 3,5 МБ/с – BarsMonster

2

Это будет сложно на PHP, даже с ускорителями. Я бы написал модуль C++ специально для этой функции (но даже на C++ это не очень просто).

4

Вам нужны криптографические псевдослучайные числа? В противном случае вы могли бы попробовать реализовать Linear feedback shift register

+1

Я бы использовал "высокое качество", а не «реальный» в этом контексте: попробуйте определить, когда беспорядочно выглядящий поток «действительно» псевдослучайен ... Но если создание реального времени - это требование, спросите, действительно ли вам нужен криптографический поток качества. Crappy и быстро могут быть способом ... – dmckee

+0

Вы правы, конечно. – Silfverstrom

+1

Ни в коем случае реализация PHP не даст 200 Мбит/с. Просто невозможно, пока PHP не будет использовать JIT-компилятор :-) – BarsMonster

1

В пик теоретического максимума на 3 ГГц процессора (x86), вы бы бюджет чуть менее 4 команд процессора в случайном байте, если вы пытаетесь ударить 200MB/с , Реальная производительность будет значительно меньше. Я бы сказал, что это будет чрезвычайно сложно на любом языке. Вы хорошо разбираетесь в скоростях, которые, как правило, используют выделенный аппаратный ускоритель (т. Е. Вы пытаетесь сделать 1,56 Гбит в секунду). В сетевых или видеоприложениях имеется значительное количество внешнего оборудования, предназначенного для разрешения такой пропускной способности. Чрезвычайно эффективная реализация в C или сборке может позволяет вам ударить это ограничение, но вы действительно нажимаете пределы того, что возможно, используя только аппаратное обеспечение общего назначения.

Я бы рассмотрел либо предварительную генерацию данных (как уже было предложено), либо использование какого-либо аппаратного криптоаккулятора, чтобы поразить все, что похоже на эти виды пропускной способности. Я нашел это list of crypto accelerator hardware vendors.

В качестве последней мысли вы на самом деле означали 200 мега байт в секунду, верно? Если вы имели в виду мега битов, то эта проблема гораздо более легко разрешима.

+0

. Суммы таковы, что значительная, но скорость имеет значение. Кашированное решение будет в порядке. /dev/urandom @ ~ 20MB/s будет в порядке. Процессор x64 с процессором x64 облегчил бы проблемы с производительностью, однако система была бы напряженной (если вообще возможно). (байты) –

Смежные вопросы