Ein anderer Gesichtspunkt, ob und wann man Perl-Module anstatt selbstgeschriebener Routinen verwenden sollte, fiel mir später ein - das Thema hat offensichtlich in meinem Kopf noch rumgespukt :
Ich habe mir mal eine (zugegebenermaßen übertrieben große) Ini-Datei wie folgt gebastelt:
Code:
for i in `seq 1 10000`; do
echo "[sect$i]" >>config.ini
for k in `seq 1 10`; do
echo "par$k=$i$k" >>config.ini
done
done
(daraus wurden ca. 1,2 MB) und dann beide Varianten mal laufen lassen (get_sect.pl ist die handgestrickte Variante, get_sect2.pl diejenige, die Config::IniFiles benutzt):
Code:
jan@jack:~/tmp/fcut> time ./get_sect.pl sect5000 <config.ini >config_teil.ini
real 0m0.116s
user 0m0.094s
sys 0m0.003s
jan@jack:~/tmp/fcut> time ./get_sect2.pl config.ini sect5000 >config_teil2.ini
real 1m16.293s
user 1m16.145s
sys 0m0.079s
Bei einer config.ini mit 1.000 statt 10.000 Sektionen (110 KB) sah es immer noch so aus:
Code:
jan@jack:~/tmp/fcut> time ./get_sect.pl sect500 <config.ini >config_teil.ini
real 0m0.021s
user 0m0.018s
sys 0m0.004s
jan@jack:~/tmp/fcut> time ./get_sect2.pl config.ini sect500 >config_teil2.ini
real 0m1.094s
user 0m1.083s
sys 0m0.010s
Der Ini-Parser liest offensichtlich erst die gesamte Datei ein, parst sie und stellt erst dann die Ergebnisse bereit. Einer der Prozessoren war in dieser Zeit mit 100% ausgelastet. Man sollte also meiner Meinung nach - wenn keine Notwendigkeit besteht, die Datei zu validieren oder die Ergebnisse weiterzuverwenden - lieber mal die Arme-Leute-Version (selbstgebastelt) nehmen - das spart unter Umständen viel Zeit, auch bei kleineren Ini-Files, wenn man oft drübergehen muss.
Jan
P.S.: awk ist noch nen Tick schneller:
Code:
jan@jack:~/tmp/fcut> time awk -f get_sect.awk -v par_sect=sect500 config.ini >config_teil3.ini
real 0m0.016s
user 0m0.014s
sys 0m0.001s
Lesezeichen