Teste de velocidade com shell

1. Teste de velocidade com shell

Perfil removido
removido

(usa Nenhuma)

Enviado em 19/03/2011 - 00:05h

Estou usando um comando "wine" e quero usar ferramentas de filtragem para filtrar a saída de erros dele (entre as ferramentas de filtragens, estou usando o sed, grep, cut...)
para passar de uma ferramenta para outra, devo usar o pipe (|), ex:

cut -d " " -f 3 | sed 's/ /\n/g' | sort

Porém o pipe passa o stdout de um comando para o stdin do outro. Porém eu quero filtrar a saída de erros do wine. Assim, para o pipe realizar minhas necessidades, ele teria que passar a stderr do primeiro comando para o stdin do segundo. Para isso eu usei o 2>&1 para passar o erro do wine para a saída padrão.

Ficou um negócio mais ou menos assim:

wine $programa_a_ser_executado 2>&1 | grep err:module:import_dll | cut -d " " -f 3 | sed 's/ /\n/g' | sort | uniq

Depois tentei, ao invés de usar o redirecionador 2>&1, passar o erro do wine para um arquivo, e depois fazer a filtragem desse arquivo, ficou algo assim:

wine $programa_a_ser_executado 2> log.txt
cat log.txt | grep err:module:import_dll | cut -d " " -f 3 | sed 's/ /\n/g' | sort | uniq

Nesse segundo, eu usei duas linhas, passando o erro do wine para um arquivo e filtrando-o com o grep, cut, sed... para obter o erro específico que eu quero.


A pergunta é:

O segundo caso (passando o erro do wine para um arquivo e depois filtrando) saiu bem mais rápido que o primeiro, mesmo ele passando o erro para um arquivo para depois fazer a filtragem. Mas o primeiro caso faz tudo direto (sem passar por arquivo) foi bem lento, comparado ao primeiro, onde o resultado saiu quase que instantaneamente.

Resumindo, ambos fazem a mesma coisa mas um que parece ser um gato mal feito, é o mais rápido.

Espero ter sido o mais claro possível, obrigado.





  


2. Re: Teste de velocidade com shell

Mauricio Souza Klein
Hebang

(usa Arch Linux)

Enviado em 19/03/2011 - 00:35h

Oi!

Bem, eu custo a acreditar que a questão esteja nos filtros, mas sim no próprio Wine, que eh bem complexo e o qual com certeza não tem tempo de execucão linear.

Porém, ignorando o tempo de execucão do Wine, pense comigo:
* No primeiro exemplo, você redireciona a saida de erros para a saida padrao, criando uma saida só em teoria. Então:
Saida final = saida de erro + saida padrão;

* No segundo exemplo, voce redireciona para o arquivo apenas a saida de erro, a padrão é jogada na tela sem filtro. Logo:
Saida final = saida de erro;

Considerando que a saida padrao corresponde a mais de 90% de todos os outputs de um programa, no segundo casa muuuuuito menos informacões são tratadas pelos filtros. Logo, certamente jogar no arquivo seria mais rápido.

Porém ressalto: acredito que seja mais uma impressao, pelo fato de o Wine nao ter um tempo medio de execucao, se me entende. Além do mais, redirecionar a saida de um comando para um arquivo coloca o processo na fila de IO do SO, que é algo bem mais lento que redirecionar para um pipe.

Bom, é uma questão mais filosófica que técnica, mas é bem interessante :)

Espero ter contribuído na questão.


3. Re: Teste de velocidade com shell

Perfil removido
removido

(usa Nenhuma)

Enviado em 19/03/2011 - 10:59h

Mklein, nuito obrigado pela resposta.

Tem alguma forma de eu só filtrar o erro sem que eu o junte à saída padrão?

Porquê eu acho que usar um arquivo é fazer uma gambiarra tremenda, e eu acho muito feio.


4. Re: Teste de velocidade com shell

Mauricio Souza Klein
Hebang

(usa Arch Linux)

Enviado em 19/03/2011 - 11:18h

Ola!

Utilize o exemplo abaixo:

./meu_script.sh 2>&1 > /dev/null | grep .......

Primeiro redirecionamos a saida de erro para a saida padrao (2>&1) e então redirecionamos a saida padrao original para o /dev/null (> /dev/null).

Dessa forma, apenas a saida de erro será enviada para a saida padrão e, consequentemente, para o pipe.

Espero ter ajudado!


5. Re: Teste de velocidade com shell

Perfil removido
removido

(usa Nenhuma)

Enviado em 19/03/2011 - 17:06h

Eu tentei fazer hoje de manhã o mesmo que você falou, redirecionando a saída de erro para a saída padrão e a saída padrão para a saída 4 que eu criei com o comando exec (ao invés de redireciona-la para /dev/null) Ficou algo mais ou menos assim:

wine $programa_a_ser_executado 2>&1 1>&4 | grep err:module:import_dll | cut -d " " -f 3 | sed 's/ /\n/g' | sort | uniq

Até que a saída seja filtrada e o comando termine, levou tanto tempo quanto o primeiro exemplo. E o segundo exemplo (que passa o stderr para um arquivo) continua mais rápido ainda (quase instantâneo).

Vou tentar mais tarde esse comando que você passou para ver se é mais rápido (estou em máquina windows da escola agora).


6. Re: Teste de velocidade com shell

Perfil removido
removido

(usa Nenhuma)

Enviado em 19/03/2011 - 18:47h

Pois é, também tentei desse jeito que você passou, com o /dev/null e foi tão devagar quanto.

Enquanto o segundo exêmplo ocorre instantâneamente...

Os outros comandos demoram cerca de 6 segundos

De qualquer forma obrigado, mas creio que não seja isso que você me explicou, já que essas últimas tentativas deram tão lento quanto a minha primeira.



7. Re: Teste de velocidade com shell

Mauricio Souza Klein
Hebang

(usa Arch Linux)

Enviado em 20/03/2011 - 17:49h

Se importaria de passar o script em questão para o grupo?

Agora fiquei curioso quanto a isso :P

Abraco!


8. Re: Teste de velocidade com shell

Perfil removido
removido

(usa Nenhuma)

Enviado em 21/03/2011 - 20:04h

Bom, este script serve para filtrar o erro do wine em busca de um arquvo .dll (biblioteca do DOS) faltante, necessária para a execução de um programa do windows (.exe), imprimindo na tela um diálogo do zenity mostrando quais bibliotecas estão faltando

Eu já publiquei na área de scripts aqui no Viva o Linux, mas até agora não saiu (Ê DEMORA...).

De lá para cá (do tempo que enviei o script até agora) eu já fiz algumas modificações no script (as principais são: imprimir o erro em inglês ou português e suportar executaveis com nenhuma biblioteca faltante (na "primeira" versão, caso o executável não tivesse bibliotecas faltantes, o erro era impresso do mesmo jeito)).

Eu só fui perceber do delay da filtragem recentemente, por isso que fiz essa pergunta aqui, caso queira ver o script, ele está aqui (quando o VoL publicá-lo, eu edito e deleto essa resposta)

Essa é a versão em português, para testar, renomeio o binário do wine (/usr/bin/wine) para pine (/usr/bin/pine) e coloque o script em alguma pasta na variável de ambiente PATH (/usr/bin, por exêmplo). Neste caso, estou passando o erro do wine para uma variável na pasta /tmp

=====================

#! /bin/bash

idioma=$(echo $LANG | cut -d"." -f 1 | cut -d"_" -f 1)

appp=$(echo $* | sed 's/ /\n/g' | grep .*\.exe | grep .*\.... -n | grep ^1: | sed 's/^1://g')
if [ x${appp} = "x" ] ; then
appname=""
else
appname=$(basename $appp)" "
fi

###Parametros

# Retorno do comando "wine" (WINE SEM NENHUM PARÂMETRO)
if [ $# = 0 ] ; then
echo "Nenhum parâmetro foi passado ao wine, por favor, execute o comando 'wine --help' para mais informações" && exit 1
fi

case $1 in

# Retorno do comando "wine--help" (WINE COM PARÂMETRO DE AJUDA)
--help) pine --help ;;

# Retorno do comando "wine --version" (WINE COM PARÂMETRO DE VERSÃO)
--version) pine --version ;;

# Retorno do comando "wine --*" (WINE COM PARÂMETRO DESCONHECIDO)
--*) echo "O parâmetro passado não existe, por favor, execute o comando 'wine --help' para mais informações" && exit 1 ;;

# Retorno do comando "wine programa.exe" (WINE COM ARQEUIVO *.EXE PASSADO)
*)
pine $* 2> /tmp/.t.log
cat /tmp/.t.log
dllerror=$(cat /tmp/.t.log | grep err:module:import_dll | cut -d " " -f 3 | sed 's/ /\n/g' | sort | uniq)
count="x"$(echo $dllerror | sed 's/\n/:/g' | sed 's/ /:/g' )

if [ $count != "x" ] ; then
zenity --title="*.dll faltante" --error --text="O programa \"$appname\"não pôde ser executado corretamente devido a falta da(s) biblioteca(s):\n\n$dllerror" && exit 1
fi ;;
esac







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts