[linux] Testovací dátový súbor

(-K JohnNy johnny64 na swissjabber.org
Pondělí Červen 15 18:21:37 CEST 2009


>   Ahojte!
> 
> Len sa chcem podeliť, veď som dávno nepísal :-)
> 
> Majme zadanie vygenerovať súbor obsahujúci milión-krát znak 'x'
> bez nového riadku a na konci tohto výstupu jeden nový riadok.

Zaujímavý problém, trošku som sa inšpiroval a vyskúšal ďalšie možnosti
riešenia. (-;

> ----------------------------
> let i=0
> while [ $i -lt 1000000 ]
> do
>   echo -n x
>   let i++
> done
> echo
> ----------------------------
> 
> Tento skript síce svoj účel splní, ale trvá mu to na 2GHz Intel
> notebooku takmer minútu.

Ja som to skúsil na EeePC, kde to dopadlo takto:

johnny64 at zriebae:~$ time (i=0; while [ $i -lt 1000000 ]; do echo -n x; \
i=$((i+1)); done; echo) > heh.bash

real    4m10.182s
user    3m37.790s
sys     0m26.482s


> -----------------------------
> for i in `seq 1 1000000`
> do
>   echo x
> done | tr -d '\n'
> echo
> -----------------------------
> 
> Tak tento to zvládne oproti prvému za polovičný čas. No stále som
> nespokojný. Skúšam to inak:

Tento som ani neskúsil, pretože seq(1) je špecifický pre Linux a odkedy
som skúsil FreeBSD, vyhýbam sa mu.

> -----------------------------
> dd if=/dev/zero bs=500 count=2000 2>/dev/null | tr '\0' x
> echo
> -----------------------------

Toto sa asi rozumne prekonať nedá, u mňa

johnny64 at zriebae:~$ time (dd if=/dev/zero bs=500 count=2000 \
2>/dev/null | tr '\0' x; echo) > /dev/null

real    0m0.055s
user    0m0.032s
sys     0m0.016s

Ale skúsil som pokračovať v iných jazykoch. Začal som pythonom:

johnny64 at zriebae:~$ time (echo -e \
'import sys\nfor i in range(1000000):\n    sys.stdout.write("x")\nprint' \
 | python > /dev/null)

real    0m5.958s
user    0m5.572s
sys     0m0.116s

Podstatne rýchlejšie, než bash, ale stále nič extra.

Tu by asi niekto iný vyskýšal perl, ale s tým ja skúsenosti nemám
a nechce sa mi študovať ho. (-;

Haskell bol o niečo obtiažnejší, kým som sa nedozvedel o putStr
a putStrLn. Najprv program interpretovaný ghc interpreterom:

johnny64 at zriebae:~$ time ghc -e \
'putStrLn (['\'x\'' | x <- [1..1000000]])' > /dev/null

real    0m4.688s
user    0m4.392s
sys     0m0.092s

Rozdiel oproti pythonu je iba čosi vyše sekundy, čiže nie veľký zisk.
Po kompilácii však haskellovský program pobežal rádovo rýchlejšie:

johnny64 at zriebae:~$ echo \
'main = putStrLn (['\'x\'' | x <- [1..1000000]])' > ghcheh.hs && \
ghc -O2 -o ghcheh ghcheh.hs && time ./ghcheh > /dev/null; rm ghcheh*

real    0m0.238s
user    0m0.220s
sys     0m0.008s

Keď už som ale začal kompilovať, nech, skúsime klasické C.

johnny64 at zriebae:~$  echo -e '#include <stdio.h>\nint main(){int i; \
for (i = 0; i < 1000000; ++i) putchar('\'x\''); \
putchar('\'\\\\n\''); return 0;}' > cheh.c && cc -O2 -o cheh cheh.c \
&& time ./cheh > /dev/null; rm cheh*

real    0m0.142s
user    0m0.112s
sys     0m0.000s

Bolo mi jasné, že program v C bude rýchlejší, než program v Haskelli,
ale pravdu povediac, očakával som väčší rozdiel.

Každopádne, po niekoľkých hodinkách zabitých takouto duchaplnou
a nepochybne veľmi užitočnou činnosťou sa asi idem pustiť do niečoho
rozumnejšieho. (-;

(-K

-- 
(-K JohnNy aka Partial Derivative ∂
[home] http://johnny64.fixinko.sk/
[icq] 338328204 [abandoned]
[jabber] JohnNy64 at swissjabber.org
[skype] JohnNy64-konik [abandoned]
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 196 bytes
Desc: not available
URL: <http://lists.linux.sk/pipermail/linux/attachments/20090615/a87e7c34/attachment.bin>


Další informace o konferenci linux