【问题标题】:Change the speed of /dev/urandom改变 /dev/urandom 的速度
【发布时间】:2013-04-27 13:30:25
【问题描述】:

有没有办法控制/dev/urandom的速度

例如,我有这样的二进制序列生成器:

grep -ao "[01]" /dev/urandom|tr -d \\n

我需要让它更慢,每秒 100 个符号,每秒 1000 个符号。

【问题讨论】:

    标签: performance shell random generator


    【解决方案1】:

    您可以使用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
    【解决方案2】:

    如果你有 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)}'
    

    【讨论】:

    • 有点大,不是纯 bash,但脚本运行良好。第二个脚本版本不能在我的 Linux Mint 机器上本地运行“无法在 @INC 中找到 IO/handle.pm(@INC 包含:...”。
    • 确认第二个脚本,不用grep也能正常工作,喜欢。
    【解决方案3】:

    这可能会因处理器而异,但尝试起来很有趣

    #!/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
    

    【讨论】:

    • 得到:tr:非法字节序列
    • 为我工作。只有一个问题:提议的脚本不能很好地处理产生 1000 位/秒的微延迟,但它仍然是有趣的解决方案。
    • 相当不错。微睡眠后不是“1”,而是 1 美元,因此您可以从脚本外部精确延迟。在另一种情况下需要 #!/bin/bash 开头,它会引发错误。
    猜你喜欢
    • 2017-11-17
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-19
    • 1970-01-01
    相关资源
    最近更新 更多