/ Forside / Teknologi / Udvikling / Perl / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Perl
#NavnPoint
bjarneA 141
poul_from 50
soccer 30
Nicknack 14
Tmpj 0
At generere store mængder dummy data
Fra : Morten Guldager


Dato : 28-05-06 13:55

Hejsa,

Til perfomance tests har jeg brug for en hurtig
måde at generere store mængder semi-tilfældige
data.

Det er ikke helt godt nok bare at tage en scalar
med nuller, eller andre ens bytes. De bliver
alt for let komprimeret undervejs.
Men data behøver heller ikke være super-tilfældige,
sådan krypto-nørd-aktige.

Jeg prøvede med en 2k scalar med random data,
som jeg så genbrugte. Men det gennemskuede
test-objektet snilt. (et tapedrev)

Hvordan kringler jeg den i perl? (på en linux klods)


/Morten

 
 
Adam Sjøgren (28-05-2006)
Kommentar
Fra : Adam Sjøgren


Dato : 28-05-06 15:01

On 28 May 2006 12:55:20 GMT, Morten wrote:

> Det er ikke helt godt nok bare at tage en scalar
> med nuller, eller andre ens bytes. De bliver
> alt for let komprimeret undervejs.
> Men data behøver heller ikke være super-tilfældige,
> sådan krypto-nørd-aktige.

Måske kunne du lave pseudo-tilfældige bytes med:

my $random_byte=pack("c", int(rand(256)));

?

Du kan også bare læse fra /dev/urandom, så sparer du at bruge perl.


Mvh.

--
"USA står nu på Mars Adam Sjøgren
Jeg så det på mit tv asjo@koldfront.dk
De breder sig som pest og SARS
Flyttemænd får nok at se til"

Morten Guldager (01-06-2006)
Kommentar
Fra : Morten Guldager


Dato : 01-06-06 06:26

2006-05-28 Adam Sjøgren wrote
> On 28 May 2006 12:55:20 GMT, Morten wrote:
>
>> Det er ikke helt godt nok bare at tage en scalar
>> med nuller, eller andre ens bytes. De bliver
>> alt for let komprimeret undervejs.
>> Men data behøver heller ikke være super-tilfældige,
>> sådan krypto-nørd-aktige.
>
> Måske kunne du lave pseudo-tilfældige bytes med:
>
> my $random_byte=pack("c", int(rand(256)));

Tjo, men så er

pack("I", int(rand(0xffffffff)))

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 ?


/Morten

Adam Sjøgren (01-06-2006)
Kommentar
Fra : Adam Sjøgren


Dato : 01-06-06 21:55

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

Morten Guldager (04-06-2006)
Kommentar
Fra : Morten Guldager


Dato : 04-06-06 12:56

2006-06-01 Adam Sjøgren wrote
> 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.

Måske.
> 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)

På min maskine fik jeg følgende resultat: (samme program)

Benchmark: timing 10 iterations of /dev/urandom, 1 million ints, 4 million chars...
/dev/urandom: 24 wallclock secs ( 0.05 usr + 23.20 sys = 23.25 CPU) @ 0.43/s (n=10)
1 million ints: 20 wallclock secs (17.95 usr + 0.36 sys = 18.31 CPU) @ 0.55/s (n=10)
4 million chars: 74 wallclock secs (70.35 usr + 1.45 sys = 71.80 CPU) @ 0.14/s (n=10)

> Næsten fire gange hurtigere, og langsommere end at lade kernen om det.

Her er vi (vores maskiner ihvertfald) ikke helt enige.

Jeg kører Linux-2.6.11.4 (Suse 9.3)

$ cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 15
model : 1
model name : Intel(R) Pentium(R) 4 CPU 1.60GHz
stepping : 2
cpu MHz : 1614.657
cache size : 256 KB
fdiv_bug : no
hlt_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 2
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm
bogomips : 3194.88

Hvad med dig?

/Morten

Adam Sjøgren (04-06-2006)
Kommentar
Fra : Adam Sjøgren


Dato : 04-06-06 14:18

On Sun, 04 Jun 2006 11:55:50 GMT, Morten wrote:

> På min maskine fik jeg følgende resultat: (samme program)

> Benchmark: timing 10 iterations of /dev/urandom, 1 million ints, 4 million chars...
> /dev/urandom: 24 wallclock secs ( 0.05 usr + 23.20 sys = 23.25 CPU) @ 0.43/s (n=10)
> 1 million ints: 20 wallclock secs (17.95 usr + 0.36 sys = 18.31 CPU) @ 0.55/s (n=10)
> 4 million chars: 74 wallclock secs (70.35 usr + 1.45 sys = 71.80 CPU) @ 0.14/s (n=10)

> Jeg kører Linux-2.6.11.4 (Suse 9.3)

> $ cat /proc/cpuinfo
> processor : 0
> vendor_id : GenuineIntel
> cpu family : 15
> model : 1
> model name : Intel(R) Pentium(R) 4 CPU 1.60GHz

Min første test var på:

$ uname -a
Linux topper 2.6.16-asjo-powerpc #1 Sun Mar 26 00:29:11 CET 2006 ppc GNU/Linux
$ cat /proc/cpuinfo
processor : 0
cpu : 7447A, altivec supported
clock : 1416.666661MHz
revision : 0.2 (pvr 8003 0102)
bogomips : 82.94
timebase : 41620997
machine : PowerMac10,1
motherboard : PowerMac10,1 MacRISC3 Power Macintosh
detected as : 287 (Mac mini)
pmac flags : 00000010
L2 cache : 512K unified
pmac-generation : NewWorld
$

og den anden på:

$ uname -a
Linux virgil 2.6.15-asjo-p4 #1 PREEMPT Sat Feb 18 13:28:03 CET 2006 i686 GNU/Linux
$ cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 15
model : 2
model name : Intel(R) Pentium(R) 4 CPU 2.00GHz
stepping : 4
cpu MHz : 2005.070
cache size : 512 KB
fdiv_bug : no
hlt_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 2
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm
bogomips : 4013.01

$

Men nu får jeg da lyst til at prøve på nogle flere:

$ ./random.pl && uname -a && cat /proc/cpuinfo
Benchmark: timing 10 iterations of /dev/urandom, 1 million ints, 4 million chars...
/dev/urandom: 11 wallclock secs ( 0.03 usr + 11.53 sys = 11.56 CPU) @ 0.87/s (n=10)
1 million ints: 8 wallclock secs ( 8.61 usr + 0.20 sys = 8.81 CPU) @ 1.14/s (n=10)
4 million chars: 35 wallclock secs (34.26 usr + 0.62 sys = 34.88 CPU) @ 0.29/s (n=10)
Linux elfaza 2.6.17-rc5-asjo-pm #1 PREEMPT Thu Jun 1 00:48:50 CEST 2006 i686 GNU/Linux
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 13
model name : Intel(R) Celeron(R) M processor 1.60GHz
stepping : 8
cpu MHz : 1596.350
cache size : 1024 KB
fdiv_bug : no
hlt_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 2
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat clflush dts acpi mmx fxsr sse sse2 ss tm pbe nx up
bogomips : 3196.83

$

Den gav samme ordning som din maskine.

En til:

$ ./random.pl && uname -a && cat /proc/cpuinfo
Benchmark: timing 10 iterations of /dev/urandom, 1 million ints, 4 million chars...
/dev/urandom: 16 wallclock secs ( 0.09 usr + 15.38 sys = 15.47 CPU) @ 0.65/s (n=10)
1 million ints: 22 wallclock secs (21.39 usr + 0.52 sys = 21.91 CPU) @ 0.46/s (n=10)
4 million chars: 80 wallclock secs (79.77 usr + 0.55 sys = 80.32 CPU) @ 0.12/s (n=10)
Linux hodja 2.6.16-asjo-tmef #1 PREEMPT Thu Apr 13 14:37:55 CEST 2006 i686 GNU/Linux
processor : 0
vendor_id : GenuineTMx86
cpu family : 15
model : 2
model name : Transmeta Efficeon(tm) Processor TM8000
stepping : 4
cpu MHz : 999.882
cache size : 1024 KB
fdiv_bug : no
hlt_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 1
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 sep mtrr pge mca cmov pat pse36 clflush acpi mmx fxsr sse sse2 ss tm mmxext longrun lrti
bogomips : 2033.72

$

Og en til:

$ ./random.pl && uname -a && cat /proc/cpuinfo
Benchmark: timing 10 iterations of /dev/urandom, 1 million ints, 4 million chars...
/dev/urandom: 74 wallclock secs ( 0.34 usr + 69.47 sys = 69.81 CPU) @ 0.14/s (n=10)
1 million ints: 63 wallclock secs (58.15 usr + 0.92 sys = 59.07 CPU) @ 0.17/s (n=10)
4 million chars: 250 wallclock secs (232.53 usr + 3.61 sys = 236.14 CPU) @ 0.04/s (n=10)
Linux gnalle 2.6.15-asjo-686 #1 Sat Feb 18 16:07:34 CET 2006 i686 GNU/Linux
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 5
model name : Pentium II (Deschutes)
stepping : 2
cpu MHz : 300.016
cache size : 512 KB
fdiv_bug : no
hlt_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 2
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 sep mtrr pge mca cmov pat pse36 mmx fxsr
bogomips : 600.63

$

Den gav også samme ordning som på din.


Opsummering:

/dev/urandom ints chars Linux

PPC G4 1.4 GHz 14 19 71 2.6.16
P4 2 GHz 13 15 57 2.6.15
P4 1.6 GHz 24 20 74 2.6.11.4
Cm 1.6 GHz 11 8 35 2.6.17-rc5
TE 1 GHz 16 22 80 2.6.16
P2 300 MHz 74 62 250 2.6.15


Hmm, det viser sig at jeg nok har misforstået hvad /dev/urandom gør -
det er vist ikke rimeligt at tænke på den som "simpel rand() i
kernen", så det er nok æbler og pærer vi sammenligner.


Det var så dagens fuldstændigt meningsløse talgymnastik...


Mvh.

--
"Carsten Jensens ånd hjemsøger motorkontoret i Adam Sjøgren
Rødovre!" asjo@koldfront.dk

Thorbjørn Ravn Ander~ (05-10-2006)
Kommentar
Fra : Thorbjørn Ravn Ander~


Dato : 05-10-06 15:14

Morten Guldager <Morten.Guldager@gmail.com> writes:

> Hvordan kringler jeg den i perl? (på en linux klods)

2k er nok alt for lidt.

Hvis din maskine er rimeligt velforsynet så kan du eventuelt åbne alle
filerne i /usr/bin efter tur og bruge dem som data :)

--
Thorbjørn Ravn Andersen

Morten Guldager (05-10-2006)
Kommentar
Fra : Morten Guldager


Dato : 05-10-06 20:48

2006-10-05 Thorbjørn Ravn Andersen wrote
> Morten Guldager <Morten.Guldager@gmail.com> writes:
>
>> Hvordan kringler jeg den i perl? (på en linux klods)
>
> 2k er nok alt for lidt.

Ikke forstået.

> Hvis din maskine er rimeligt velforsynet så kan du eventuelt åbne alle
> filerne i /usr/bin efter tur og bruge dem som data :)

Jo, men så får jeg jo ikke data hurtigere end jeg kan læse fra disken.
(og der er forøvrigt alt for lidt data i min /usr/bin)


/Morten

Thorbjørn Ravn Ander~ (05-10-2006)
Kommentar
Fra : Thorbjørn Ravn Ander~


Dato : 05-10-06 21:45

Morten Guldager <Morten.Guldager@gmail.com> writes:

> >> Hvordan kringler jeg den i perl? (på en linux klods)
> >
> > 2k er nok alt for lidt.
>
> Ikke forstået.

Til at båndstationen opfatter det som ukomprimerbart.

>
> > Hvis din maskine er rimeligt velforsynet så kan du eventuelt åbne alle
> > filerne i /usr/bin efter tur og bruge dem som data :)
>
> Jo, men så får jeg jo ikke data hurtigere end jeg kan læse fra disken.
> (og der er forøvrigt alt for lidt data i min /usr/bin)

Næææh, men du kunne jo repetere det for at fylde op.

Er båndstationen hurtigere end disken?

--
Thorbjørn Ravn Andersen

Morten Guldager (06-10-2006)
Kommentar
Fra : Morten Guldager


Dato : 06-10-06 19:43

2006-10-05 Thorbjørn Ravn Andersen wrote
> Morten Guldager <Morten.Guldager@gmail.com> writes:
>
>> >> Hvordan kringler jeg den i perl? (på en linux klods)
>> >
>> > 2k er nok alt for lidt.
>>
>> Ikke forstået.
>
> Til at båndstationen opfatter det som ukomprimerbart.

Ah, jeg ser misforståelsen.

Jo, til mit tapedrev gik det fint nok.

Jeg har dog i mellemtiden brugt samme kodestump til at teste
netværks overførsler. Her var nettet langt hurtigere end min disk.

Du havde bare klippet så meget af mit oprindelige indlæg væk at jeg
ikke fattede hvad det var jeg startede med at bruge koden til...

Jeg endte i noget med at allokere en stor buffer som jeg så fyldte
op med junk data. I perl skrev jeg så bare "print S $buffer;" og så
var den sag klaret. (inden i et loop naturligvis)


/Morten

Søg
Reklame
Statistik
Spørgsmål : 177414
Tips : 31962
Nyheder : 719565
Indlæg : 6407849
Brugere : 218876

Månedens bedste
Årets bedste
Sidste års bedste