Wenn ich nur alle 100 wörter anstatt bei jedem mein Hauptfeld reallocate spare ich 0.3-0.5 sekunden. Erhöh ich das noch mehr, wird die Ersparnis minimal. Aber naja, bin mal gespannt was in der Übung erzählt wird
edit: finds übrigens sehr gut, dass hier auch direkt vom SoS1-Team ratschläge und tipps gegeben werden. thumbs up
Jetzt wird’s ja immer toller… wenn ich mein Programm auf einen Rechner im CIP-Pool kopiere und über SSH da ausführe, braucht’s gleich 12.5s während fsort immerhin 2.8s braucht. ??WTF??
fread() mit grösserem buffer, der notfalls nur ein paarmal erweitert und am schluss auf die richtige grösse geändert wird & bissel ptr-arithmetik für die behandlung der gelesenen “rohdaten”, sowie die sicherheit dass keinerlei daten rumkopiert werden bringt mir ziemlich genau den gleichen speed wie fsort im moment: 0.05 - 0.1 langsamer für wlist5 (1.710 vs 1.780)
wenn ich zusätzlich noch mit -O3 compile is sogar leicht schneller
aber noch alles -ansi konform, also kein inline
gcc -ansi -pedantic -D_POSIX_SOURCE -Wall -Werror -O3 …
ich würde drauf tippen daß das was mit dem paging des betriebssystem zu tun hat. wenn dein speicher größer als ne speicherseite ist muss das os zwischen seiten schalten soweit ich das verstanden habe
Sodale. Habe heute “unfreiwilligerweise” meine Freizeit damit verbracht nochma wsort umzucoden. Ihr kennt das ja, man fängt 19:00 an und zack isses mitternacht.
Wenn ich mit reiner speicheraddressierung rechne, d.h. fast keine mallocs, komm ich ganz ganz knapp an fsort ran. Der bremsende Punkt ist hier wahrscheinlich fgets. Wenn ich fread nehmen würde, könnte es hinhauen. Das Prinzip is einfach, man malloced nen großen Speicherbereich und schreibt alle Strings hinternander. Die listen elemente kriegen dann die anfangspositionen der einzelnen Strings. Das geht ohne weiteres, da strcmp nur bis zum “\ 0” liest. Wer also absolut nicht zufrieden mit den Werten seines Programms ist sollte somit den nötigen Speed erhalten.
Ein anderer erstaunlicher speedboost ist folgender: Anstatt malloc(101*sizeof(char)) oder ähnliches zu machen, versucht nur den Bereich zu allocaten den ihr für euren String braucht, also mit strlen. das bringt gute 700 ms auf der faui05 maschine, falls ihr das nicht ohnehin schon so habt.
Danke für die Tipps. Schade, dass fgets nicht gleich noch die länge zurückliefert.
/me wird sich wohl doch noch mal hinsetzen und ein paar Stündchen an seinen Zeilen basteln.
P.s: Hab grade die Einleitunng zu gprof überflogen. Das klingt ja sehr vielversprechend. Da wird wohl wirklich noch ein wenig Zeit drauf gehen…
frustriert gprof hat die selben Probleme wie time: 80% der Zeit gehen auf meine wrapper-funktion und 8% auf strcmp - was ja irgendwie nicht sein kann. Und im CIP krieg ichs gar nicht zum laufen. Die gmon.out wird zwar generieret aber gprof kann nichts damit anfangen. => Kompatibilitätsproblem?! :#:
jup hatte auch mal gprof im cip probiert, scheint irgendwie nicht zu gehn, sowohl mit cc als auch gcc mit -pg compiled, er erzeugt zwar eine gmon.out, beim aufruf von gprof jedoch sagt er immer: ‘gmon.out file is missing call-graph data’
komische sache, weiss da jemand näheres drüber?
fsort version 2
Ich habe auch mal fsort mit gprof untersucht.
time seconds seconds calls Ts/call Ts/call name
47.04 0.15 0.15 main
40.76 0.28 0.13 cmp_fkt
12.54 0.32 0.04 frame_dummy
So wie es scheint wird viel Zeit in cmp_fkt verbracht. Darum habe ich diese Funktion mal
einwenig verbessert. Das Result ist /proj/i4sos/pub/aufgabe2/fsort2
faui05d [fsort]>/usr/bin/time -p ./fsort2 < /tmp/wlist5.wawi > /dev/null
real 2.39 - 2.47
user 2.34 - 2.38
sys 0.06 - 0.10
faui05d [fsort]>/usr/bin/time -p ./fsort < /tmp/wlist5.wawi > /dev/null
real 2.71 - 2.78
user 2.51 - 2.58
sys 0.09 - 0.18
Ich denke das auch in fsort2 noch viel Luft drin ist. Wer will kann ja mal mit
allen Mitteln versuchen schneller zu werden, bitte eine solche Lösung dann in einer
getrennten Datei als fsort.c abgeben und nicht als wsort.c. :cheesy:
mal schaun ob mir noch was einfällt…
btw, wie hast du genau im cip compiled um gprof zu verwenden… einfach mit -pg?
wie gesagt, haut nicht ganz hin, s. mein voriges posting
OOPS!
Ich habe die strcmp-Implementierung ausgetauscht, aber … okay die glibc macht
einen cast zu (unsigned char ). Ich habe das mal angepasst.
gprof auf den CIP-Kisten funktioniert eigentlich ganz normal gcc -pg -o fsort-pg fsort.c
gprof fsort-pg gmon.out
Welchen gprof habt Ihr den im Path? which gprof
/usr/bin/gprof
Das Problem ist nur das die libc ja nicht mit ge-Profiled wird, und dort
eigentlich die meiste Arbeit geschied strcmp, qsort, etc. Das sieht man
dann natuerlichnicht. Auch die compiler optimierung bezieht sich nur
auf die eigenen Funktionen. Darum bringen diese nicht ganz so viel.
Ich benutze fuer fsort nur -O2 und fuer fsort2 -O2 -fomit-framepointer.
ok, langsam ist das ende der optimierbarkeit erreicht (zumindest für mich :)) - hab nun auch mal einen blick in die gprof daten geworfen (ging nach wie vor nicht im cip, einziger ausweg: mit -static binden, hab dazu auch was in google gefunden, wo jemand das gleiche problem berichtet- bug? jermand meinte dann liegt wohl wenn dann am gcc, bzw den libs?!)
und siehe da: die cmp funktion hat am meisten verbraten. (welch wunder ;))
also selbige durch eigenen, etwas optimierten code ersetzt (guter tipp). da ging dann noch ein wenig was rauszuholen:
ich wüsste nicht was ich an der cmp funktion optimieren könnte… ich gehe davon aus daß strcmp weitestgehendst optimiert ist, und viel mehr macht mein cmp nicht.