Wer hätte Lust auf einen kleinen Wettbewerb? Es soll darum gehen, daß eine relativ einfache Aufgabe gestellt wird, die mittels PHP mit möglichst wenig Code und am effizientesten gelöst wird. Eine Kommentierung des Code, Fehlerbehandlung, Ausnahmefestigkeit ist egal, nur funktionieren muß er rein mit internen Sprachmitteln einer normalen PHP-Installation.
Hätte jemand Lust auf so ein Spielchen?
Homepage selbermachen 7.852 Themen, 35.619 Beiträge
Lust schon, nur würd ich aufgrund meiner kaum vorhandenen Kenntnisse in geschickter Programmierung wohl gnadenlos abrauchen ;-)
Im Übrigen eine gute Methode um anderen die eigene Arbeit aufzubrummen *g*
Lust schon, aber wenns zu doll und heftig ist, dann wirst du wohl allein bleiben :-)
sag das thema und ich bin dabei :-)
Klar - zu jeder Tages und Nachtzeit ;-) Weißt doch das ich gerne effektiven Code schreibe...
Gut, 3 Mitstreiter wären also da :o)...@czuk: mist, ich bin enttarnt ;o)...nein, aber im ernst, ich denke es ist eine gute übung und man kann anhand desstils der anderen bestimmt lernen.
Nun zur Aufgabe:
Schaffen wir uns mal eine Benchmarkroutine für Mögliche weitere Wettbewerbe selbst. Es geht also darum, eine Funktion zu schreiben, welche eine andere Funktion bencht. Daraus ergeben sich folgende Anforderungen:
-
- Der Name der zu prüfenden Funktion muß übergeben werden können
-
- Die Anzahl der Durchläufe für den Test muß übergeben werden können
-
- Die Funktionsparameter müssen übergeben werden können
-
- Rückgabewert soll die durchschnittliche Laufzeit der getesteten Funktion sein
-
Wie schon erwähnt muß Ausnahmefestigkeit, Bereichsprüfungen oder sonstiges nicht implementiert sein, gehen wir mal davon aus, daß Überprüfungen extern gehandhabt werden. Wenn etwas schief läuft soll einfach FALSE gelifert werden.
Und jetzt mal los (gilt auch für mich, sowas hab ich nicht in meinem Fundus).
PS: Man kann das natürlich auch als Klasse implementieren, nur wird dies wohl der Performance weniger zuträglich sein ;O)
PPS: Was ich noch alles vergessen habe:
Als Bewertungskriterium dachte ich mir:
2* Durchschnittliche Laufzeit des langsamsten Programmes / durchschnittliche Laufzeit + Codezeilen des längsten Programmes / Codezeilen
Als Zeitrahmen dachte ich bis morgen Abend 20:00. Der gewinner darf die neue Aufgabe stellen.
Da könnte man dann allerdings noch drüber philosophieren wann etwas schief gelaufen ist...
Ich hab meine Routine fertig - bisher ohne eine FALSE-Rückgabe im Fehlerfall...
Interessant wäre jetzt allerdings auch noch ob eine genauere Messung oder ein schlankerer Code wichtig sind.
Okay, Rückgabewert false kann man streichen....eine Rückgabe der Zeit oder im Fehlerfall eben gar nichts ist genau so gut denke ich.
Messen sollte die Funktion natürlich so genau, daß ein Benchmark sinnvoll ist. Ich denke um das Ganze reizvoll genug zu machen sollte man jede Funktion von sich selbst benchen lassen...hat dann jemand nur Sekunden implementiert sieht´s halt bös aus ;o)...
Meine ist auch fertig, hab sie heut am frühen Abend geschrieben, war also nichts, was ich vorher schon hatte wie schon erwähnt.
Das ist natürlich klar...
Ich denke um das Ganze reizvoll genug zu machen sollte man jede Funktion von sich selbst benchen lassen...
Das hatte ich schon gemacht, dann müssten wir uns aber noch auf eine Testfunktion für die innere Benchmark-function einigen...
Wie soll das dann eigentlich mit der Veröffentlichung laufen? Alle gleichezeit um 20:00? Evtl. beim Chatbesucht?
Ich denke die Benchmarkfunktion ist relativ egal, da ohnehin alle mit der gleichen getestet werden. Mein Funktion habe ich bisher immer mit der exp() gestestet (also einer PHP-eigenen Funktion).
Wie soll das dann eigentlich mit der Veröffentlichung laufen? Alle gleichezeit um 20:00?
Ich denke es muß nicht Punkt 20:00 sein, aber man sollte schon einen Termin nehmen, von dem man annimmt, daß die anderen mit ihrer Funktion auch schon fertig sind. Ich nehme eh an, daß bei einer so einfachen Funktion die meisten eh sehr ähnlich sein werden.
Gute Idee - die läuft deutlich schneller als eine leere selbst definierte Fkt. Hast Du die exp-Fkt mit konstantem oder variablem Wert aufgerufen?
Willst Du dann eigentlich alle Fkts bei Dir benchmarken lassen (mit Apache/PHP excl. auf einer CPU)? Wenn das jeder selbst macht könnten die Ergebnisse u.U. nur schwer vergleichbar sein...
Ich wollte alles zentral auf dem Chatserver benchen, jede Funktion auf einer eigenen Seite mit mehreren Durchläufen (so ca. 1000) und Mittelwerte bilden und das ganze dann nach der vorher schon genannten Formel gewichten nach Codezeilen und Laufzeit. Der Code soll für jeden einsehbar sein, um es transparent zu machen.
Die exp hab ich übrigens immer mit festem Wert übergeben. e10
Hallo,
will auch mitmachen, habe aber die aufgabenstellung nicht verstanden - so doof das klingt :-)
gibts das nochmal vereinfacht?
Ok, ich versuche es, falls nciht frag bitte nochmal gezielt nach.
Es geht darum eine Funktion zu schreiben, mit Hilde derer man eine beliebige andere Funktion auf Leistung testen kann. Der Name der zu prüfenden Funktion (beliebig) muß also als Argument übergeben werden, ebenso die Zahl, wie oft hintereinander die zu prüfende Funktion hintereinander ausgeführt werden soll im Test und die Argumente für die zu prüfende Funktion.
function Benchmark(string Funktionsname, int Wiederholungen, Parameter){
// Teste Funktion Funktionsname mit Parametern auf Leistung (durchschnittliche Laufzeit)
}
so, ich fange mal an, da ich leider gleich weg muß, hier mein Code
function Benchmark($a){
$d=microtime();
$e=0;
while($e++<$a[1]){call_user_func_array($a[0],$a[2]);}
return (array_sum(explode(' ',microtime()))-array_sum(explode(' ',$d)))/$a[1];
}
Eingabewert ist ein Array, das folgendermaßen aussieht:
array('Name der Testfunktion','Widerholungen',array('Argumente der Funktion'))
Als Beispiel:
$dauer=Benchmark( array( 'exp' , 1000 , array( 10 ) ) );
Dann mach ich doch direkt weiter:
list($u,$s)=explode(' ',microtime()); $t=$s+$u; // Startzeit bestimmen
for($i=0; $i++<$n; call_user_func_array($f,$p)); // f n mal ausführen
list($u,$s)=explode(' ',microtime()); return ($s+$u-$t)/$n; // Zeitdiffernz bestimmen
}
Leider nur 2 Teilnehmer, schade...aber für alle interessierten hier die Ergebnisse:
Ergebnisse