convertir variables en bash

Astor Giacomo agiacom en optonline.net
Sab Ago 13 03:32:03 CLT 2005


On Thursday 11 August 2005 10:31 pm, Horst von Brand wrote:

> agiacom en optonline.net wrote:
> > porque es horriblemente ineficiente si $lineas es medianamente grande. A
> > menos que $lineas sea muy chico, cualquier solucion es mejor que usar
> > $(seq ...).
>
> No entiendo... el programa seq(1) se invoca solo la primera vez que se
> encuentra con la linea for. Si se te ocurre hacerlo para decenas de miles
> de lineas en una de esas algo revienta, pero...

El comando seq se invoca una sola vez, pero, (1) para valores grandes,
 produce una lista enorme que bash luego tiene que partir, etc. y (2) no hay
 forma de que bash aproveche el hecho de que esta usando _numeros_ y no texto
arbitrario. Por ejemplo:

[Sorry si esto no se ve del todo alineado. En ese caso la culpa es de kmail]

$ cat a.sh
for i in $(seq ${TOP-10000}); do

  : $i

done

$ cat b.sh
for ((i = 0; i < ${TOP-10000}; i++)); do

  : $i

done

$ cat c.sh
i=0
while [ $i -lt ${TOP-10000} ]; do

 : $((i++))

done

$ perl -MBenchmark -e 'timethese(10, { \
  "seq" => sub{system("sh a.sh")}, \
  "for((...))" => sub{system("sh b.sh")}, \
  "[ -lt ]" => sub{system("sh c.sh")}})'
Benchmark: timing 10 iterations of [ -lt ], for((...)), seq...
   [ -lt ]:  4 wallclock secs ( 4.86 cusr  0.15 csys =  5.01 CPU)
for((...)):  3 wallclock secs ( 3.85 cusr  0.11 csys =  3.96 CPU)
       seq:  5 wallclock secs ( 4.91 cusr  0.05 csys =  4.96 CPU)

No muy dramatico, cierto. La cosa se pone mucho peor mientras mas grande el
numero de iteraciones:

$ TOP=25000 perl -MBenchmark -e 'timethese(10, { \
  "seq" => sub{system("sh a.sh")}, \
  "for((...))" => sub{system("sh b.sh")}, \
  "[ -lt ]" => sub{system("sh c.sh")}})'
Benchmark: timing 10 iterations of [ -lt ], for((...)), seq...
   [ -lt ]: 13 wallclock secs ( 12.29 cusr  0.38 csys = 12.68 CPU)
for((...)): 10 wallclock secs ( 9.29 cusr  0.22 csys =  9.52 CPU)
       seq: 29 wallclock secs ( 28.73 cusr  0.06 csys = 28.79 CPU)

Si el numero de iteraciones es el numero de lineas en un archivo, 25000
no es para nada excesivo.

Ocioso a las 3:30am,
-ag

-------------------------------------------------------


Más información sobre la lista de distribución Linux