Bonjour à vous,
j'ai besoin d'améliorer le temps d’exécution d'un script sur lequel je bosse, chaque dixième de seconde est bon à prendre.
En faisant des tests, je me suis rendu compte de la chose suivante : le temps d'appel à une fonction interne alourdi beaucoup le temps de travail ?!
Je venais donc vers vous pour avoir vos avis, est-ce normal ?
Au final faut il se passer de fonction et allonger le code ?!
Quelles sont les bonnes pratiques lors de la création de fonction ?
Exemple très proche de mes besoins :
Le but est d'éliminer les %[0-9]/[0-9] et %[0-9] où chaque nombre peut être constitué entre 1 et 3 chiffres.
L'ordre est important car il ne faudrait pas dégager %1/1 avant %1/10 car sinon ce dernier se changera en 0.
PS : Si vous avez une façon plus rapide de réaliser cette action, je prends 🙂
Donc exit les sed & co ou les =~.
Version la plus rapide : 0m0,264s
time for x in {0..1000}
do
Value="%1 Bonjour %2/5 Monsieur"
[[ ${Value} == *%[0-9][0-9][0-9]/[0-9][0-9][0-9]* ]] && Value="${Value//%[0-9][0-9][0-9]\/[0-9][0-9][0-9]}"
[[ ${Value} == *%[0-9][0-9][0-9]/[0-9][0-9]* ]] && Value="${Value//%[0-9][0-9][0-9]\/[0-9][0-9]}"
[[ ${Value} == *%[0-9][0-9][0-9]/[0-9]* ]] && Value="${Value//%[0-9][0-9][0-9]\/[0-9]}"
[[ ${Value} == *%[0-9][0-9]/[0-9][0-9][0-9]* ]] && Value="${Value//%[0-9][0-9]\/[0-9][0-9][0-9]}"
[[ ${Value} == *%[0-9][0-9]/[0-9][0-9]* ]] && Value="${Value//%[0-9][0-9]\/[0-9][0-9]}"
[[ ${Value} == *%[0-9][0-9]/[0-9]* ]] && Value="${Value//%[0-9][0-9]\/[0-9]}"
[[ ${Value} == *%[0-9]/[0-9][0-9][0-9]* ]] && Value="${Value//%[0-9]\/[0-9][0-9][0-9]}"
[[ ${Value} == *%[0-9]/[0-9][0-9]* ]] && Value="${Value//%[0-9]\/[0-9][0-9]}"
[[ ${Value} == *%[0-9]/[0-9]* ]] && Value="${Value//%[0-9]\/[0-9]}"
[[ ${Value} == *%[0-9][0-9][0-9]* ]] && Value="${Value//%[0-9][0-9][0-9]}"
[[ ${Value} == *%[0-9][0-9]* ]] && Value="${Value//%[0-9][0-9]}"
[[ ${Value} == *%[0-9]* ]] && Value="${Value//%[0-9]}"
a="${Value}"
Value="%1/5 Bonjour %2 Monsieur"
[[ ${Value} == *%[0-9][0-9][0-9]/[0-9][0-9][0-9]* ]] && Value="${Value//%[0-9][0-9][0-9]\/[0-9][0-9][0-9]}"
[[ ${Value} == *%[0-9][0-9][0-9]/[0-9][0-9]* ]] && Value="${Value//%[0-9][0-9][0-9]\/[0-9][0-9]}"
[[ ${Value} == *%[0-9][0-9][0-9]/[0-9]* ]] && Value="${Value//%[0-9][0-9][0-9]\/[0-9]}"
[[ ${Value} == *%[0-9][0-9]/[0-9][0-9][0-9]* ]] && Value="${Value//%[0-9][0-9]\/[0-9][0-9][0-9]}"
[[ ${Value} == *%[0-9][0-9]/[0-9][0-9]* ]] && Value="${Value//%[0-9][0-9]\/[0-9][0-9]}"
[[ ${Value} == *%[0-9][0-9]/[0-9]* ]] && Value="${Value//%[0-9][0-9]\/[0-9]}"
[[ ${Value} == *%[0-9]/[0-9][0-9][0-9]* ]] && Value="${Value//%[0-9]\/[0-9][0-9][0-9]}"
[[ ${Value} == *%[0-9]/[0-9][0-9]* ]] && Value="${Value//%[0-9]\/[0-9][0-9]}"
[[ ${Value} == *%[0-9]/[0-9]* ]] && Value="${Value//%[0-9]\/[0-9]}"
[[ ${Value} == *%[0-9][0-9][0-9]* ]] && Value="${Value//%[0-9][0-9][0-9]}"
[[ ${Value} == *%[0-9][0-9]* ]] && Value="${Value//%[0-9][0-9]}"
[[ ${Value} == *%[0-9]* ]] && Value="${Value//%[0-9]}"
b="${Value}"
Value="%5/1 Bonjour %5 Monsieur"
[[ ${Value} == *%[0-9][0-9][0-9]/[0-9][0-9][0-9]* ]] && Value="${Value//%[0-9][0-9][0-9]\/[0-9][0-9][0-9]}"
[[ ${Value} == *%[0-9][0-9][0-9]/[0-9][0-9]* ]] && Value="${Value//%[0-9][0-9][0-9]\/[0-9][0-9]}"
[[ ${Value} == *%[0-9][0-9][0-9]/[0-9]* ]] && Value="${Value//%[0-9][0-9][0-9]\/[0-9]}"
[[ ${Value} == *%[0-9][0-9]/[0-9][0-9][0-9]* ]] && Value="${Value//%[0-9][0-9]\/[0-9][0-9][0-9]}"
[[ ${Value} == *%[0-9][0-9]/[0-9][0-9]* ]] && Value="${Value//%[0-9][0-9]\/[0-9][0-9]}"
[[ ${Value} == *%[0-9][0-9]/[0-9]* ]] && Value="${Value//%[0-9][0-9]\/[0-9]}"
[[ ${Value} == *%[0-9]/[0-9][0-9][0-9]* ]] && Value="${Value//%[0-9]\/[0-9][0-9][0-9]}"
[[ ${Value} == *%[0-9]/[0-9][0-9]* ]] && Value="${Value//%[0-9]\/[0-9][0-9]}"
[[ ${Value} == *%[0-9]/[0-9]* ]] && Value="${Value//%[0-9]\/[0-9]}"
[[ ${Value} == *%[0-9][0-9][0-9]* ]] && Value="${Value//%[0-9][0-9][0-9]}"
[[ ${Value} == *%[0-9][0-9]* ]] && Value="${Value//%[0-9][0-9]}"
[[ ${Value} == *%[0-9]* ]] && Value="${Value//%[0-9]}"
c="${Value}"
done
Visuellement c'est lourd, ça rallonge la taille du fichier...
Version avec une pseudo fonction, pratiquement aussi rapide : 0m0,312s
function ColorCleaning
{
Value="${1}"
[[ ${Value} == *%[0-9][0-9][0-9]/[0-9][0-9][0-9]* ]] && Value="${Value//%[0-9][0-9][0-9]\/[0-9][0-9][0-9]}"
[[ ${Value} == *%[0-9][0-9][0-9]/[0-9][0-9]* ]] && Value="${Value//%[0-9][0-9][0-9]\/[0-9][0-9]}"
[[ ${Value} == *%[0-9][0-9][0-9]/[0-9]* ]] && Value="${Value//%[0-9][0-9][0-9]\/[0-9]}"
[[ ${Value} == *%[0-9][0-9]/[0-9][0-9][0-9]* ]] && Value="${Value//%[0-9][0-9]\/[0-9][0-9][0-9]}"
[[ ${Value} == *%[0-9][0-9]/[0-9][0-9]* ]] && Value="${Value//%[0-9][0-9]\/[0-9][0-9]}"
[[ ${Value} == *%[0-9][0-9]/[0-9]* ]] && Value="${Value//%[0-9][0-9]\/[0-9]}"
[[ ${Value} == *%[0-9]/[0-9][0-9][0-9]* ]] && Value="${Value//%[0-9]\/[0-9][0-9][0-9]}"
[[ ${Value} == *%[0-9]/[0-9][0-9]* ]] && Value="${Value//%[0-9]\/[0-9][0-9]}"
[[ ${Value} == *%[0-9]/[0-9]* ]] && Value="${Value//%[0-9]\/[0-9]}"
[[ ${Value} == *%[0-9][0-9][0-9]* ]] && Value="${Value//%[0-9][0-9][0-9]}"
[[ ${Value} == *%[0-9][0-9]* ]] && Value="${Value//%[0-9][0-9]}"
[[ ${Value} == *%[0-9]* ]] && Value="${Value//%[0-9]}"
}
time for x in {0..1000}
do
ColorCleaning "%1 Bonjour %2/5 Monsieur"
a="${Value}"
ColorCleaning "%1/5 Bonjour %2 Monsieur"
b="${Value}"
ColorCleaning "%5/1 Bonjour %5 Monsieur"
c="${Value}"
done
Je n'aime pas trop, je n'ai pas l'impression que c'est une "vraie fonction" (elle ne renvoie rien) et pas fan du côté toutes les variables sont globales et se mélangent entre le script et la fonction.
Mais c'est moins de lignes et plus lisible.
La même chose avec ce que je considère comme une vrai fonction : 0m9,696s :
function ColorCleaning
{
# Valeur à nettoyer
local Value="${1}"
# Nettoyage des couleurs possibles
[[ ${Value} == *%[0-9][0-9][0-9]/[0-9][0-9][0-9]* ]] && Value="${Value//%[0-9][0-9][0-9]\/[0-9][0-9][0-9]}"
[[ ${Value} == *%[0-9][0-9][0-9]/[0-9][0-9]* ]] && Value="${Value//%[0-9][0-9][0-9]\/[0-9][0-9]}"
[[ ${Value} == *%[0-9][0-9][0-9]/[0-9]* ]] && Value="${Value//%[0-9][0-9][0-9]\/[0-9]}"
[[ ${Value} == *%[0-9][0-9]/[0-9][0-9][0-9]* ]] && Value="${Value//%[0-9][0-9]\/[0-9][0-9][0-9]}"
[[ ${Value} == *%[0-9][0-9]/[0-9][0-9]* ]] && Value="${Value//%[0-9][0-9]\/[0-9][0-9]}"
[[ ${Value} == *%[0-9][0-9]/[0-9]* ]] && Value="${Value//%[0-9][0-9]\/[0-9]}"
[[ ${Value} == *%[0-9]/[0-9][0-9][0-9]* ]] && Value="${Value//%[0-9]\/[0-9][0-9][0-9]}"
[[ ${Value} == *%[0-9]/[0-9][0-9]* ]] && Value="${Value//%[0-9]\/[0-9][0-9]}"
[[ ${Value} == *%[0-9]/[0-9]* ]] && Value="${Value//%[0-9]\/[0-9]}"
[[ ${Value} == *%[0-9][0-9][0-9]* ]] && Value="${Value//%[0-9][0-9][0-9]}"
[[ ${Value} == *%[0-9][0-9]* ]] && Value="${Value//%[0-9][0-9]}"
[[ ${Value} == *%[0-9]* ]] && Value="${Value//%[0-9]}"
# Renvoie du résultat
echo "${Value}"
}
time for x in {0..1000}
do
a=$(ColorCleaning "%1 Bonjour %2/5 Monsieur")
b=$(ColorCleaning "%1/5 Bonjour %2 Monsieur")
c=$(ColorCleaning "%5/1 Bonjour %5 Monsieur")
done
Visuellement agréable, la fonction renvoie une valeur récupérée, mais niveau timing, c'est juste pas possible.
Merci à vous, bon dimanche et bon courage pour le confinement.