Am 19.06.2011 15:25, schrieb Hendrik Woltersdorf:
Am Samstag, 18. Juni 2011, 23:44:54 schrieb Tao te Puh:
Am 18.06.2011 19:30, schrieb Sandy Drobic:
On 18.06.2011 16:59, Tao te Puh wrote:
Es ist die Lokalisierung !
Szenario: Ich habe mir ein Verzeichnis mit 4162 PDF-Dateien erzeugt (~1,3GB). Darin suche ich mit grep:
time grep -i "hurz" /mnt/tmp_pdf/*
Das dauert 5m42.398s.
Dann stelle ich die Lokalisierung um auf C (das ist der Standard bei Tiny Core Linux):
export LANG=C export LANGUAGE=C export LC_ALL=C
und führe genau die gleiche Suche durch:
time grep -i "hurz" /mnt/tmp_pdf/*
Das dauert lediglich 0m7.566s.
Die Suche ist also 48x schneller.
Kann mir das jemand erklären?
Hast du vor dem zweiten Versuch auch den Rechner neu gestartet? Wenn nicht, dann hast du deine Suche aus dem Cache bedient. Versuche es doch mal anders herum: erst auf C umstellen (NACH Neustartt!!), messen, dann auf UTF8 noch einmal messen.
Ich habe, innerhalb einer Sitzung, mehrfach gemessen. Dabei habe ich die Lokalisierung auch mehrfach hin- und zurückgestellt. Die Ergebnisse differieren minimal (-> Cache spielt hier also keine Rolle), der Unterschied zwischen den Lokalisierungen, bleibt aber immens. Auch auf einem anderen System, dort läuft 11.2, habe ich diesen Effekt nachvollziehen können.
Interessant ist aber vielleicht das Folgende: Auf einem Alt-System mit SuSE 9.3, ist der Unterschied zwischen unterschiedliche Lokalisierung nur minimal, also praktisch 0.
Ansonsten kannst Du das sehr einfach und schnell selber testen:
Folgende Kommandos erzeugen ein Verzeichnis (/mnt/tmp_nullfiles) und darin 1000 Dateien mit jeweils 1MB. Dann wird mit grep getestet, die Lokalisierung gewechselt und erneut getestet:
mkdir /mnt/tmp_nullfiles
# 1000 Dateien mit jeweils 1MB anlegen i=1; while [ $i -le 1000 ]; do dd if=/dev/zero of=/mnt/tmp_nullfiles/nullfile-$i bs=1M count=1; i=$(( $i + 1 )); done;
# Test mit locale=de_DE.UTF-8 time grep -i "hurz" /mnt/tmp_nullfiles/*
# Lokalisierung wechseln export LANG=C export LANGUAGE=C export LC_ALL=C
# Test mit locale=C time grep -i "hurz" /mnt/tmp_nullfiles/*
# Lokalisierung wieder zurückstellen export LANG=de_DE.UTF-8 export LANGUAGE=de_DE.UTF-8 export LC_ALL=de_DE.UTF-8
Mach mal "strace" statt time für ein einzelnes nullfile, dann dürfte der Unterschied klar werden. Die Variante mit einer locale <> "C" versucht, jede Menge Dateien zu öffenen, in denen die Lokalisierungen beschrieben sind (/usr/lib/locale/ ...). mfg Hendrik
hi, soweit ich mich erinnern kann, liegt das an einem sog. UTF-Patch für die coreutils und/oder "grep" (ist schon etwas länger her). Eine Suche nach "grep utf performance" ergibt auch bei anderen Distris entsprechende Meldungen. Vor allem die Kombination von Multibyte und --ignore-case (-i) sorgt für einen spürbaren Einbruch der Performance (alle Tests mit de_DE.UTF-8): paolo@worker:/tmp> time grep -i "hurz" /tmp/_nullfiles/* real 0m36.063s user 0m35.805s sys 0m0.248s paolo@worker:/tmp> time grep "hurz" /tmp/_nullfiles/* real 0m1.961s user 0m1.715s sys 0m0.244s Es existieren scheinbar schon einige Patches, um das Ganze für "grep" zu beschleunigen - vielleicht bekomme ich das mal zum Testen zusammen. Alternativ könnte man "ack" verwenden, damit geht es auch mit --ignore-case (-i) deutlich flotter: paolo@worker:/tmp> time ack -i "hurz" /tmp/_nullfiles/* real 0m4.056s user 0m3.746s sys 0m0.307s Ciao, Paolo -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org