[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