【发布时间】:2013-04-27 13:30:25
【问题描述】:
有没有办法控制/dev/urandom的速度
例如,我有这样的二进制序列生成器:
grep -ao "[01]" /dev/urandom|tr -d \\n
我需要让它更慢,每秒 100 个符号,每秒 1000 个符号。
【问题讨论】:
标签: performance shell random generator
有没有办法控制/dev/urandom的速度
例如,我有这样的二进制序列生成器:
grep -ao "[01]" /dev/urandom|tr -d \\n
我需要让它更慢,每秒 100 个符号,每秒 1000 个符号。
【问题讨论】:
标签: performance shell random generator
您可以使用pv 来(除其他外)限制来自管道的数据:
grep -ao "[01]" /dev/urandom | tr -d \\n | pv -q -L 100
在这里,我使用-L 作为“限制”来获得每秒最多 100 字节的输出速率。 -q 用于抑制来自pv 的调试输出。对于每秒 1000 字节,您可以改用 -L 1000 或 -L 1k。
【讨论】:
xxd,根据您的回答,我认为以下内容将从/dev/urandom 浪费更少的字节。 cat /dev/urandom | xxd -b | cut -f2-7 -d' ' | tr -d ' '\\n | pv -q -L 100
如果你有 perl,例如可以制作一个小脚本,例如cps.pl
#!/usr/bin/perl
use strict;
use warnings;
use Time::HiRes qw(usleep);
local $|=1;
while(<>) {
chomp;
print $_;
usleep(100000);
}
然后运行:
grep -ao "[01]" /dev/urandom | perl cps.pl
利用睡眠时间来获得正确的速度。也许也想用 perl 实现 grep 部分。
#!/usr/bin/perl
use strict;
use warnings;
use Time::HiRes qw( usleep);
open my $rfd, "<:raw", "/dev/urandom" or die "$!";
my $buff;
local $|=1;
while() {
read ($rfd, $buff, 1);
next unless $buff =~ /[01]/;
usleep(10000);
print $buff;
}
close $rfd;
只需运行perl cps.pl
添加: 如果您不需要加密安全的随机数,您可以使用下一个单行:
perl -MTime::HiRes -e '$|=1;while(1){print int(rand(2)); Time::HiRes::usleep(10000)}'
【讨论】:
这可能会因处理器而异,但尝试起来很有趣
#!/bin/bash
microsleep ()
{
for (( y=0; y<$1*50; y++ ))
do
:
done
}
tr -cd 01 </dev/urandom | while read -n1 b
do
printf $b
microsleep 1
done
结果
$ timeout 1 microsleep.sh > log
$ stat -c%s log
1011
【讨论】: