| TCH (statz) | ![]() #1, Főfasz (10579) |
3573 | #1778 | ^ | Idézet | Sun, 30 Oct 2011 18:29:58 +01 |
| 46.107.*.* |
|
*.catv.pool.telekom.hu |
| Gondoltam kitesztelem, melyik a jobb, a Linux véletlenszámgenerátora, vagy amit tegnap írtam. Két dolgot vizsgáltam, a sebességet és az ismétlés nélkül legenerált számok mennyiségét. rndtest.c: void main()
{
int i;
for (i = 0; i < 500000000; ++i) rand();
}rndtest1.c:#include "rnd1.c"
void main()
{
int i;
for (i = 0; i < 500000000; ++i) rnd1();
}Eredmény:root@Csabi:~# gcc rndtest.c -O3 root@Csabi:~# time ./a.out real 0m14.109s user 0m14.097s sys 0m0.008s root@Csabi:~# gcc rndtest1.c -O3 root@Csabi:~# time ./a.out real 0m22.426s user 0m22.417s sys 0m0.008sVagyis 22426/14109=1.58948, azaz a Linux, illetve a libc véletlenszámgenerátora ~60%-al gyorsabb. Viszont a másik tesztben: rndtest.c: void main()
{
srand(0);
int i, j;
unsigned int l;
unsigned int tbl[1048576];
for (i = 0; i < 1048576; ++i)
{
l = rand();
for (j = 0; j < i; ++j)
{
if (l == tbl[j])
{
printf("%d\n", i);
return;
}
}
tbl[i] = l;
}
}rndtest1.c#include "rnd1.c"
void main()
{
__seed = 0;
int i, j;
unsigned int l;
unsigned int tbl[1048576];
for (i = 0; i < 1048576; ++i)
{
l = rnd1();
for (j = 0; j < i; ++j)
{
if (l == tbl[j])
{
printf("%d\n", i);
return;
}
}
tbl[i] = l;
}
}Eredmény:root@Csabi:~# gcc rndtest.c -O3 root@Csabi:~# ./a.out 15357 root@Csabi:~# gcc rndtest1.c -O3 root@Csabi:~# ./a.out 1049300:1 0xb11193c1 seed értékkel: root@Csabi:~# gcc rndtest.c -O3 root@Csabi:~# ./a.out 102640 root@Csabi:~# gcc rndtest1.c -O3 root@Csabi:~# ./a.out 601081:1 0xfa52fe7 seed értékkel: root@Csabi:~# gcc rndtest.c -O3 root@Csabi:~# ./a.out 41026 root@Csabi:~# gcc rndtest1.c -O3 root@Csabi:~# ./a.out 516881:2 0xffffffff seed értékkel: root@Csabi:~# gcc rndtest.c -O3 root@Csabi:~# ./a.out 53585 root@Csabi:~# gcc rndtest1.c -O3 root@Csabi:~# ./a.out 490372:2 1 seed értékkel: root@Csabi:~# gcc rndtest.c -O3 root@Csabi:~# ./a.out 15357 root@Csabi:~# gcc rndtest1.c -O3 root@Csabi:~# ./a.out 126633:2 4743463 seed értékkel: root@Csabi:~# gcc rndtest.c -O3 root@Csabi:~# ./a.out 46003 root@Csabi:~# gcc rndtest1.c -O3 root@Csabi:~# ./a.out 1019043:3 0x986fae83 seed értékkel: root@Csabi:~# gcc rndtest.c -O3 root@Csabi:~# ./a.out 80668 root@Csabi:~# gcc rndtest1.c -O3 root@Csabi:~# ./a.out 401034:3 982357 seed értékkel: root@Csabi:~# gcc rndtest.c -O3 root@Csabi:~# ./a.out 56884 root@Csabi:~# gcc rndtest1.c -O3 root@Csabi:~# ./a.out 1043614:4 986739687 seed értékkel: root@Csabi:~# gcc rndtest.c -O3 root@Csabi:~# ./a.out 62171 root@Csabi:~# gcc rndtest1.c -O3 root@Csabi:~# ./a.out 514995:4 666 seed értékkel: root@Csabi:~# gcc rndtest.c -O3 root@Csabi:~# ./a.out 43118 root@Csabi:~# gcc rndtest1.c -O3 root@Csabi:~# ./a.out 589305:5 Az eredmény döntetlen, ha a menetek számát nézzük. Viszont, ha az összértéket (osztva 10-el az átlag), akkor: rand(): 015357+102640+041026+053585+015357+046003+080668+056884+062171+043118=516809 rnd1(): 104930+060108+051688+049037+012663+101904+040103+104361+051499+058930=635223 635223/516809=1.22913 azaz a mi véletlenszámgenerátorunk ~23%-al precízebb, mint a Linuxé. Hát ezt úgy is lehet nézni, hogy a Linuxé nagyobb sebességkülönbséget ad, mint amekkora precizitáskülönbséget a miénk, de úgy is, hogy itt a precizitás szerintem fontosabb. :P A saját konzekvenciáját majd mindenki magának. |