zu doof dafür!
-
hey,
danke für eure hilfe und große resonanz. anscheinend hab ich da ein weitläufiges thema angestoßen!;)und das nächste mal nehm ich auch einen treffenderen betreff!;)
-
Jetzt hat's mich doch noch gejuckt und ich hab's noch auf einem M16C- Emulator mit 4 Varianten durchgebencht:
V1 - Boris' Urcode ohne for- Abbruch V2 - CStoll Einzeiler- Ergänzung V3 - Boris' Abbruchergänzung mit (buf>0) && (!seven) V4 - Boris' Abbruchergänzung mit (!seven) && (buf>0)
Die Laufweite bis 251 ergibt auf den Hunderter gerundet folgende Ergebnisse:
V2 mit 65'100 Zyklen V1 mit 67'500 Zyklen V3 mit 68'100 Zyklen V4 mit 68'200 Zyklen
Also schmerzt der zusätzliche Vergleich doch ziemlich und man kann durch günstige Anordnung sogar noch ein bißchen was tun. Immerhin liegen zwischen V2 und V4 etwa 5% Unterschied. Überraschend, daß sogar kein vorzeitiger Abbruch schneller ist, als die zusätzliche Kondition im for().
Das hat mich gewundert, also habe ich das Sieb bis 65'000 laufen lassen, dabei kommt heraus:
V2 mit 23,6 Mio Zyklen V3 mit 24,9 Mio Zyklen V4 mit 25,1 Mio Zyklen V1 mit 27,3 Mio Zyklen
Also spielt mit zunehmender Stellenzahl auch der unglücklich implementierte vorzeitige Abbruch seine Stärken aus ;). Zwischen der schwächsten und der stärksten Variante liegen so grob 15%, man schrumpft (über den Daumen skaliert) eine 3 GHz- Kiste auf eine 2,55 GHz- Maschine.
Bei der Umwandlung in einen String (ich habe noch nicht einmal eine Zeichensuche implementiert), wobei der erste for()- Block durch eindummy = sprintf( string, "%-5d", i);
ersetzt wurde, kamen
[b]Version Swordfish[/b] 134,3 Mio Zyklen
heraus. Das sind nur noch 17% der möglichen Performance
oder der 3 GHZ- Rechner wird zur 500 MHz- Uralt- Gurke.
Was ich damit sagen will: Das war jetzt exemplarisch, aber diese Performance holt auch ein besser optimierendes Compiler/Prozessor- Gespann nicht zurück.Solange Opas mit Hut im Mercel 500 SEC am Sonntag mit 40 km/h auf der Landstraße genausowenig automatisch den Führerschein verlieren, wie Swordfish die Lizenz zum Coden
wird Corel Draw wohl immer lahm bleiben. :p
@swordfish Ist Dir denn gar nicht klar, was bei der Formatstringauswertung alles passiert?
Dann zurück auf "Los" und ziehen Sie keine 200 EUR ein!
-
pointercrash() schrieb:
Solange Opas mit Hut im Mercel 500 SEC am Sonntag mit 40 km/h auf der Landstraße genausowenig automatisch den Führerschein verlieren, wie Swordfish die Lizenz zum Coden
wird Corel Draw wohl immer lahm bleiben. :p
das sehe ich ähnlich. pointercrash, du bist mir definitiv sympathisch.
-
Ich hätte noch eine kleine Optimierung:
seven = false; for(long buf=i; buf>0; buf/=10) { if(buf%10==7) { seven=true; break; } }
Erspart zumindestens einen weiteren Vergleich...
-
Th schrieb:
Erspart zumindestens einen weiteren Vergleich...
Richtig, um es genau anzugeben:
V Th 22,8 Mio Zyklen bei 65000 Durchläufen
, das sind nochmal etwa 3% gespart. Die Performance- Krone wird weitergereicht!
-
@pointercrash():
ich habs bald darauf selbst geschnallt - Meine Lizenz behalt' ich :p
greetz, Swordfish
-
Th schrieb:
Ich hätte noch eine kleine Optimierung:
seven = false; for(long buf=i; buf>0; buf/=10) { if(buf%10==7) { seven=true; break; } }
Erspart zumindestens einen weiteren Vergleich...
schmeiss noch das geteilt und den modulo-raus, dann könnte es noch schneller sein.
-
@speed-freak: schmeiss den Motor- zylinderkopf aus dem auto dann is er leichter..
-
BorisDieKlinge schrieb:
@speed-freak: schmeiss den Motor- zylinderkopf aus dem auto dann is er leichter..
mit so'nem dummen kommentar hab ich schon gerechnet^^
http://blogs.msdn.com/devdev/archive/2005/12/12/502980.aspx
-
hacker-freak schrieb:
mit so'nem dummen kommentar hab ich schon gerechnet
Ja, nee, richtig. Es wird zwangsweise zweimal das Gleiche durch 10 dividiert und mein Compiler schnallt das nicht. Der füttert zweimal die Register an und führt zweimal die im Prinzip gleiche Division durch, einmal schnappt er sich das Register mit dem Modulo- Ergebnis, einmal das mit dem Rest. Ich habe mit inline- Code gespielt, aber das ist so umständlich, dann wieder umzuspeichern, daß es fast nichts gebracht hat.
Wenn man keine HW- Dividereinheit hat, kann es sein, daß es sich rentiert, aber wg. einem Prozent auf Assembler hinunterzugehen ... ach danke, lieber nicht!@Swordfish:
War ja nicht böse gemeint, Hauptsache, der Groschen ist gefallen.Um ehrlich zu sein, ich war selbst überrascht, wieviel beim Ausparsen des Formatstrings passiert.
-
@hacker/speed-freak: ja dann her mit der lösung^^
-
BorisDieKlinge schrieb:
@hacker/speed-freak: ja dann her mit der lösung
das unterschtrichene da oben ^^ ist ein sogenannter 'link'. da kann man mit der maus draufklicken. probier's aus.
-
sag bloß..
aber der inhalt ist nich aqvivalent zu der aufgabenstellung
-
BorisDieKlinge schrieb:
aber der inhalt ist nich aqvivalent zu der aufgabenstellung
es ging ums schneller-machen und das könnte man eventuell damit erreichen, indem man die divisionen rausschmeisst, du blitzmerker.
-
Könnte mir jemand sagen wie ihr diese Tests durchführt?
Ich würde dies auch mit kritischen Teilen meines Programms machen um so herauszufinden, welche Variante die bessere ist
Vielen dank im Voraus,
MrHilfeNeeded
-
MrHilfeNeeded schrieb:
Könnte mir jemand sagen wie ihr diese Tests durchführt?
z.b. so wie Pontercrash() das gemacht hat. den code in einem simulator laufen lassen, der einem die taktzyklen anzeigt. ich glaub' er abeitet mit so'nem renesas-controller (M16C o.ä., ein 16bitter). was benutzt du?