Discussion:
[shell-script] Array mais lento do que "-f $aquivo"
Eri Ramos Bastos bastos.eri@gmail.com [shell-script]
2018-10-24 14:26:44 UTC
Permalink
Olá, lista!

Tenho um script que roda a seguinte função ~300 vezes (sourced de outro
arquivo):

check_role() {
if [ -d /etc/roles/ ]; then
if [ -f /etc/roles/$1 ]; then
return 0
fi
fi
return 1
}

Pensei que iria ganhar performance fazendo isso:

list_roles() {
if [ -d /etc/roles/ ]; then
cd /etc/roles
ls
else
echo ""
fi

}

export ROLES=($(list_roles))
check_role() {
local role=$1
for r in "${ROLES[@]}"; do
[[ "$r" == "$role" ]] && return 0
done
return 1

}

Mas na verdade o tempo de execução piorou:

Original:
real 0m2.069s
user 0m0.300s
sys 0m1.644s

Novo:
real 0m2.857s
user 0m0.348s
sys 0m2.296s


Me parece contra-intuitivo, já que o original precisa checar em disco todas
as vezes. Onde estou errado?

Obrigado!
'Julio C. Neves' julio.neves@gmail.com [shell-script]
2018-10-24 15:08:44 UTC
Permalink
Fala Eri
Acho vc ganharia performance se fizesse:

check_role() {
local ROLES=($(ls /etc/roles)) || return 1
for r in "${ROLES[@]}"; do
[[ "$r" == "$1" ]] && return 0
done
}

Abraços,
Julio

*» Não tem tempo para fazer um curso presencial?*
*» Na sua cidade não tem nenhum bom curso de Linux?*
*» **Conheça nosso portal educacional e estude conosco: *
* http://www.dicas-l.com.br/educacao
<http://www.dicas-l.com.br/educacao/>*
*» Treinamento presencial (em 4 sábados) no RJ e BSB *
* em http://bit.ly/cursoshelljulioneves
<http://bit.ly/cursoshelljulioneves> *



*Também damos treinamento em sua empresa*
*em qualquer cidade**, **com certificado **e nota fiscal.*
Post by Eri Ramos Bastos ***@gmail.com [shell-script]
Olá, lista!
Tenho um script que roda a seguinte função ~300 vezes (sourced de outro
check_role() {
if [ -d /etc/roles/ ]; then
if [ -f /etc/roles/$1 ]; then
return 0
fi
fi
return 1
}
list_roles() {
if [ -d /etc/roles/ ]; then
cd /etc/roles
ls
else
echo ""
fi
}
export ROLES=($(list_roles))
check_role() {
local role=$1
[[ "$r" == "$role" ]] && return 0
done
return 1
}
real 0m2.069s
user 0m0.300s
sys 0m1.644s
real 0m2.857s
user 0m0.348s
sys 0m2.296s
Me parece contra-intuitivo, já que o original precisa checar em disco
todas as vezes. Onde estou errado?
Obrigado!
Eri Ramos Bastos bastos.eri@gmail.com [shell-script]
2018-10-24 15:53:33 UTC
Permalink
Obrigado Júlio.

Melhorou, mas ainda inferior à original. Acho que vou manter o que tinha
mesmo. ;)

Com sua sugestão:
real 0m2.193s
user 0m0.328s
sys 0m1.772s

Original:
real 0m2.114s
user 0m0.268s
sys 0m1.768s

Abraços!
Post by 'Julio C. Neves' ***@gmail.com [shell-script]
Fala Eri
check_role() {
local ROLES=($(ls /etc/roles)) || return 1
[[ "$r" == "$1" ]] && return 0
done
}
Abraços,
Julio
*» Não tem tempo para fazer um curso presencial?*
*» Na sua cidade não tem nenhum bom curso de Linux?*
*» **Conheça nosso portal educacional e estude conosco: *
* http://www.dicas-l.com.br/educacao
<http://www.dicas-l.com.br/educacao/>*
*» Treinamento presencial (em 4 sábados) no RJ e BSB *
* em http://bit.ly/cursoshelljulioneves
<http://bit.ly/cursoshelljulioneves> *
*Também damos treinamento em sua empresa*
*em qualquer cidade**, **com certificado **e nota fiscal.*
Post by Eri Ramos Bastos ***@gmail.com [shell-script]
Olá, lista!
Tenho um script que roda a seguinte função ~300 vezes (sourced de outro
check_role() {
if [ -d /etc/roles/ ]; then
if [ -f /etc/roles/$1 ]; then
return 0
fi
fi
return 1
}
list_roles() {
if [ -d /etc/roles/ ]; then
cd /etc/roles
ls
else
echo ""
fi
}
export ROLES=($(list_roles))
check_role() {
local role=$1
[[ "$r" == "$role" ]] && return 0
done
return 1
}
real 0m2.069s
user 0m0.300s
sys 0m1.644s
real 0m2.857s
user 0m0.348s
sys 0m2.296s
Me parece contra-intuitivo, já que o original precisa checar em disco
todas as vezes. Onde estou errado?
Obrigado!
'Julio C. Neves' julio.neves@gmail.com [shell-script]
2018-10-24 16:07:10 UTC
Permalink
Se os arquivos não tiverem espaço em branco no nome, vc poderia trocar:

local ROLES=($(ls /etc/roles)) || return 1
for r in "${ROLES[@]}"; do

Por:

local ROLES=$(ls /etc/roles) || return 1
for r in $ROLES; do

Aí vc ganharia tempo, pois vetores são bem mais lentos (por isso a partir
do Bash 4.0 incorporaram a instrução mapfile para gerar vetores a partir de
arquivos).

Abraços,
Julio

*» Não tem tempo para fazer um curso presencial?*
*» Na sua cidade não tem nenhum bom curso de Linux?*
*» **Conheça nosso portal educacional e estude conosco: *
* http://www.dicas-l.com.br/educacao
<http://www.dicas-l.com.br/educacao/>*
*» Treinamento presencial (em 4 sábados) no RJ e BSB *
* em http://bit.ly/cursoshelljulioneves
<http://bit.ly/cursoshelljulioneves> *



*Também damos treinamento em sua empresa*
*em qualquer cidade**, **com certificado **e nota fiscal.*
Post by Eri Ramos Bastos ***@gmail.com [shell-script]
Obrigado Júlio.
Melhorou, mas ainda inferior à original. Acho que vou manter o que tinha
mesmo. ;)
real 0m2.193s
user 0m0.328s
sys 0m1.772s
real 0m2.114s
user 0m0.268s
sys 0m1.768s
Abraços!
Post by 'Julio C. Neves' ***@gmail.com [shell-script]
Fala Eri
check_role() {
local ROLES=($(ls /etc/roles)) || return 1
[[ "$r" == "$1" ]] && return 0
done
}
Abraços,
Julio
*» Não tem tempo para fazer um curso presencial?*
*» Na sua cidade não tem nenhum bom curso de Linux?*
*» **Conheça nosso portal educacional e estude conosco: *
* http://www.dicas-l.com.br/educacao
<http://www.dicas-l.com.br/educacao/>*
*» Treinamento presencial (em 4 sábados) no RJ e BSB *
* em http://bit.ly/cursoshelljulioneves
<http://bit.ly/cursoshelljulioneves> *
*Também damos treinamento em sua empresa*
*em qualquer cidade**, **com certificado **e nota fiscal.*
Post by Eri Ramos Bastos ***@gmail.com [shell-script]
Olá, lista!
Tenho um script que roda a seguinte função ~300 vezes (sourced de outro
check_role() {
if [ -d /etc/roles/ ]; then
if [ -f /etc/roles/$1 ]; then
return 0
fi
fi
return 1
}
list_roles() {
if [ -d /etc/roles/ ]; then
cd /etc/roles
ls
else
echo ""
fi
}
export ROLES=($(list_roles))
check_role() {
local role=$1
[[ "$r" == "$role" ]] && return 0
done
return 1
}
real 0m2.069s
user 0m0.300s
sys 0m1.644s
real 0m2.857s
user 0m0.348s
sys 0m2.296s
Me parece contra-intuitivo, já que o original precisa checar em disco
todas as vezes. Onde estou errado?
Obrigado!
itamarnet@yahoo.com.br [shell-script]
2018-10-24 16:40:21 UTC
Permalink
Caro Eri

Que tal:


check_role() {
local ROLES=$(ls /etc/roles) || return 1
grep -q -w "$1" "$ROLES" || retrun 1

}




[]'s
Itamar
Alfredo Casanova atcasanova@gmail.com [shell-script]
2018-10-24 17:27:49 UTC
Permalink
desnecessário esse -d, o ls vai voltar vazio se não tiver nada na pasta
Post by ***@yahoo.com.br [shell-script]
Caro Eri
check_role() {
local ROLES=$(ls /etc/roles) || return 1
grep -q -w "$1" "$ROLES" || retrun 1
}
[]'s
Itamar
Eri Ramos Bastos bastos.eri@gmail.com [shell-script]
2018-10-24 18:26:42 UTC
Permalink
O grep deixou ainda mais lento. :-\

Fiz umas mudanças, mas mesmo assim ainda 2ms mais lento que o
original. ¯\_(ツ)_/¯

Obrigado a todos pela ajuda.
Post by ***@yahoo.com.br [shell-script]
Caro Eri
check_role() {
local ROLES=$(ls /etc/roles) || return 1
grep -q -w "$1" "$ROLES" || retrun 1
}
[]'s
Itamar
Renato Guth de Paiva renatoguth@gmail.com [shell-script]
2018-10-26 03:59:48 UTC
Permalink
Sou novo no shell e não sei se entendi direito seu script. Posso estar
falando besteira, mas não seria mais simples apenas testar a existência do
arquivo com o comando
check_role() {
test -f /etc/roles/$1
}
Post by Eri Ramos Bastos ***@gmail.com [shell-script]
Olá, lista!
Tenho um script que roda a seguinte função ~300 vezes (sourced de outro
check_role() {
if [ -d /etc/roles/ ]; then
if [ -f /etc/roles/$1 ]; then
return 0
fi
fi
return 1
}
list_roles() {
if [ -d /etc/roles/ ]; then
cd /etc/roles
ls
else
echo ""
fi
}
export ROLES=($(list_roles))
check_role() {
local role=$1
[[ "$r" == "$role" ]] && return 0
done
return 1
}
real 0m2.069s
user 0m0.300s
sys 0m1.644s
real 0m2.857s
user 0m0.348s
sys 0m2.296s
Me parece contra-intuitivo, já que o original precisa checar em disco
todas as vezes. Onde estou errado?
Obrigado!
Eri Ramos Bastos bastos.eri@gmail.com [shell-script]
2018-10-26 11:29:26 UTC
Permalink
Talvez, hein? Vou testar depois :D

Obrigado.
Post by Renato Guth de Paiva ***@gmail.com [shell-script]
Sou novo no shell e não sei se entendi direito seu script. Posso estar
falando besteira, mas não seria mais simples apenas testar a existência do
arquivo com o comando
check_role() {
test -f /etc/roles/$1
}
Post by Eri Ramos Bastos ***@gmail.com [shell-script]
Olá, lista!
Tenho um script que roda a seguinte função ~300 vezes (sourced de outro
check_role() {
if [ -d /etc/roles/ ]; then
if [ -f /etc/roles/$1 ]; then
return 0
fi
fi
return 1
}
list_roles() {
if [ -d /etc/roles/ ]; then
cd /etc/roles
ls
else
echo ""
fi
}
export ROLES=($(list_roles))
check_role() {
local role=$1
[[ "$r" == "$role" ]] && return 0
done
return 1
}
real 0m2.069s
user 0m0.300s
sys 0m1.644s
real 0m2.857s
user 0m0.348s
sys 0m2.296s
Me parece contra-intuitivo, já que o original precisa checar em disco
todas as vezes. Onde estou errado?
Obrigado!
Loading...