On Thu, 01 Jun 2006 05:26:10 GMT, Morten wrote:
> 2006-05-28 Adam Sjøgren wrote
>> my $random_byte=pack("c", int(rand(256)));
> Tjo, men så er
> pack("I", int(rand(0xffffffff)))
(På nær 1 mulighed, ikke? int(rand(0xf) giver tal i intervallet 0 til
0xe, right?
Fuldstændigt ligegyldigt til dit brug, men alligevel...
> vel 4 gange hurtigere. Mon
> my $buffer = '';
> for (my $n = 0; $n < 1000000
> {
> $buffer .= pack("I", int(rand(0xffffffff)))
> }
> så er den hurtigste måde at producere 4 millioner tilfældige
> bytes i en scalar ?
En hurtigere måde er nok den du klippede bort, at læse fra
/dev/urandom.
Men det kan jo komme an på en prøve:
$ ./random.pl
Benchmark: timing 10 iterations of /dev/urandom, 1 million ints, 4 million chars...
/dev/urandom: 14 wallclock secs ( 0.05 usr + 13.41 sys = 13.46 CPU) @ 0.74/s (n=10)
1 million ints: 19 wallclock secs (18.54 usr + 0.26 sys = 18.80 CPU) @ 0.53/s (n=10)
4 million chars: 71 wallclock secs (70.28 usr + 0.38 sys = 70.66 CPU) @ 0.14/s (n=10)
$ cat random.pl
#!/usr/bin/perl
use strict;
use warnings;
use Benchmark qw(:all);
timethese(10, {
'4 million chars'=>sub {
my $buffer='';
for (my $i=0; $i<4000000; $i++) {
$buffer.=pack("C", int(rand(256)));
}
},
'1 million ints'=>sub {
my $buffer='';
for (my $i=0; $i<1000000; $i++) {
$buffer.=pack("I", int(rand(0xffffffff)));
}
},
'/dev/urandom'=>sub {
my $buffer;
my $fh;
open($fh, '/dev/urandom') or die "$!";
read $fh, $buffer, 4000000;
close $fh;
},
}
);
$
Her er uddata fra en maskine med en anden arkitektur (Pentium 4 2GHz,
de første resultater var en PowerPC G4 1.4GHz):
$ ./random.pl
Benchmark: timing 10 iterations of /dev/urandom, 1 million ints, 4 million chars...
/dev/urandom: 13 wallclock secs ( 0.09 usr + 13.34 sys = 13.43 CPU) @ 0.74/s (n=10)
1 million ints: 15 wallclock secs (14.42 usr + 0.39 sys = 14.81 CPU) @ 0.68/s (n=10)
4 million chars: 57 wallclock secs (55.05 usr + 1.73 sys = 56.78 CPU) @ 0.18/s (n=10)
$
Næsten fire gange hurtigere, og langsommere end at lade kernen om det.
Mvh.
--
"Vi är små citroner" Adam Sjøgren
asjo@koldfront.dk