Code Problem

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Benutzeravatar
Blutgerinsel
Mitglied
Beiträge: 1801
Registriert: 19.07.2004 18:53
Wohnort: Landkreis Ulm
Kontaktdaten:

Beitrag von Blutgerinsel »

pokepika hat geschrieben:in diesem zusammenhang geht ein switch Block auch gar nicht..

mit switch kann man keine Vergleichsoperatoren ersetzen, nur ==.. Du kannst in case nämlich keine ausdrücke reinschreiben und somit müsstest du _alle_ fälle von 0 bis 1000 aufnehmen und aktionen zu ordnen, dann von 1001 bis 2000 etc.
Um auch den jungen Padawans den Weg zum Licht zu zeigen:

Code: Alles auswählen

Switch(true)
    {
        Case $punkte >= 4500 && $runde  >= 20:
            echo "Top-Spieler";
            break;
        Case $punkte >= 3000 && $runde  >= 15:
            echo "As";
            break;
        Case $punkte >= 2000 && $runde >= 10:
            echo "Mittelklasse";
            break;
        Case $punkte >= 1000  && $runde >= 5:
            echo "Fortgeschritten";
            break;
        Case $punkte < 1000  && $runde < 5:
            echo "Anfänger";
            break;
        
    }
BTW: Nächste mal wette ich mit dir :lol:
Benutzeravatar
Pyramide
Ehrenadmin
Beiträge: 12734
Registriert: 19.04.2001 02:00
Wohnort: Meschede

Beitrag von Pyramide »

Wenn man ein switch so "misbraucht", kann man das ganze auch über Schleifen realisieren:

Code: Alles auswählen

while ( $gesamt < 1000 && $runde < 5) {
  $rang = "Anfänger";
  break;
}
for (;$gesamt > 1000 && $runde >= 5;$gesamt=0) {
  $rang = "Fortgeschritten";
}
KB:knigge
Neo_
Mitglied
Beiträge: 55
Registriert: 17.02.2005 17:25

Beitrag von Neo_ »

Hy,

Danke euch allen.

@ D@ve;
Da geb ich dir recht. Dein Code ist etwas übersichtlicher und bewirkt das selbe.

Aber kann mir jemand sagen was an meinen Code falsch war. Denn soviel unterschied ist nicht zu D@ve's Code.

Code: Alles auswählen

Mein Code:
if($gesamt<1000) $rang="Anfänger"; 
else if($gesamt>1000 AND $gesamt<2000) $rang="fortgeschritten"; 
else if($gesamt>2000 AND $gesamt<3000 AND $spieler['runde']>=5) $rang="mittelklasse Spieler"; 
else if($gesamt>3000 AND $gesamt<4500 AND $spieler['runde']>=10) $rang="Spieler As"; 
else if($gesamt>4500 AND $spieler['runde']>=15) $rang="Top Spieler"; 
hat nicht funktioniert.

Code: Alles auswählen

D@ve's Code:
if ( $gesamt < 1000) $rang = "Anfänger"; 
if ($gesamt > 1000) $rang = "Fortgeschritten"; 
if ($gesamt > 2000 && $spieler['runde'] >= 5) $rang = "Mittelklasse"; 
if ($gesamt > 3000 && $spieler['runde'] >= 10) $rang = "As"; 
if ($gesamt > 4500 && $spieler['runde'] >= 15) $rang = "Top Spieler";
Funktionier.

Also so viel unterschied seh ich darin nicht ausser das ich "else if" drinn gehabt hab. Aber das kann ja nicht der Grund sein, oder?

Und @Blutgerinsel,
Ich denk einmal, jeder hat seinen eigenen programmiersytle :)
pokepika
Mitglied
Beiträge: 167
Registriert: 01.07.2003 15:58
Wohnort: Iserlohn [NRW]
Kontaktdaten:

Beitrag von pokepika »

oh gott. @blutgerinsel :o :o

ob das dann aber kürzer und übersichtlicher als if ist ^^ :roll: und die geschwindigkeit leidet bestimmt auch etwas :roll:
Benutzeravatar
Blutgerinsel
Mitglied
Beiträge: 1801
Registriert: 19.07.2004 18:53
Wohnort: Landkreis Ulm
Kontaktdaten:

Beitrag von Blutgerinsel »

pokepika hat geschrieben:oh gott. @blutgerinsel :o :o

ob das dann aber kürzer und übersichtlicher als if ist ^^ :roll: und die geschwindigkeit leidet bestimmt auch etwas :roll:
Gibts zu dieser haltlosen Behauptung auch eine Begründung?

nunja ein Switch Block ist 100% schneller als eine Reihe von ifs die jedes mal geprüft werden müssen, so wie es in @Daves Prüfungen der Fall ist.

-> Kernfrage: Prüfung einer überflüssigen Prüfung ?

Am schnellsten würde es mit einer elseif Verzweigung funktionieren da diese schneller als der Switchblock ist....

Wobei man auch hier von groß nach klein prüfen sollte da ansonsten schon frühzeitig bei punkte 3002 und z.B. runde 20 der Rang Mittelklasse zutreffend ist...Aber falsch wäre, jedoch das verschachtelte if nicht mehr geprüft wird......

BTW: Kannst ja mal die Zeit messen
pokepika
Mitglied
Beiträge: 167
Registriert: 01.07.2003 15:58
Wohnort: Iserlohn [NRW]
Kontaktdaten:

Beitrag von pokepika »

Blutgerinsel hat geschrieben:Gibts zu dieser haltlosen Behauptung auch eine Begründung?
ist eher eine vermutung..

ich meine nur, dass es evtl. länger dauern könnte, wenn man deine methode verwendet. Immerhin hast du ja auch nichts gespart, du hast ja jeweils die if bedingung bei nem case statement reingepackt..

ich werde das jetzt gleich mal kurz testen, was schneller ist..

//edit: ok, habs jetzt mal getestet. bei mir kamen folgende werte raus:

Code: Alles auswählen

elseif: 8.0999999999998E-005
else if: 1.9999999999909E-005
switch: 3.3999999999978E-005
wobei die else if methode noch am schnellsten abschneidet..

Code: Alles auswählen

<?

$var = 5000;

###################################

$time = microtime();

if ( $var >= 5000 ) echo '5';
elseif ( $var < 5000 ) echo '4';
elseif ( $var < 4000 ) echo '3';
elseif ( $var < 3000 ) echo '2';
elseif ( $var < 2000 ) echo '1';
elseif ( $var < 1000 ) echo '0';

echo '<br><b>' . ( microtime() - $time ) . '</b>';

###################################
echo '<br><br>';
###################################

$time = microtime();

if ( $var >= 5000 ) echo '5';
else if ( $var < 5000 ) echo '4';
else if ( $var < 4000 ) echo '3';
else if ( $var < 3000 ) echo '2';
else if ( $var < 2000 ) echo '1';
else if ( $var < 1000 ) echo '0';

echo '<br><b>' . ( microtime() - $time ) . '</b>';

###################################
echo '<br><br>';
###################################

$time = microtime();

switch ( true )
{
	case $var >= 5000:
		echo '5';
	break;
	case $var < 5000:
		echo '4';
	break;
	case $var < 4000:
		echo '3';
	break;
	case $var < 3000:
		echo '2';
	break;
	case $var < 2000:
		echo '1';
	break;
	case $var < 1000:
		echo '0';	
	break;
}

echo '<br><b>' . ( microtime() - $time ) . '</b>';


?>
Zuletzt geändert von pokepika am 06.06.2005 22:08, insgesamt 1-mal geändert.
Benutzeravatar
Pyramide
Ehrenadmin
Beiträge: 12734
Registriert: 19.04.2001 02:00
Wohnort: Meschede

Beitrag von Pyramide »

Vielleicht wäre es repräsentiver, das ganze mehr als einmal durchlaufen zu lassen... :roll:
KB:knigge
pokepika
Mitglied
Beiträge: 167
Registriert: 01.07.2003 15:58
Wohnort: Iserlohn [NRW]
Kontaktdaten:

Beitrag von pokepika »

hab noch mal editiert ^^ switch war doch nicht schneller..

ich habs aber mehrmals durchlaufen lassen und die platzierungen waren immer gleich, wenn sich die Zahlen auch etwas differenzierten..
Benutzeravatar
Pyramide
Ehrenadmin
Beiträge: 12734
Registriert: 19.04.2001 02:00
Wohnort: Meschede

Beitrag von Pyramide »

Mit mehrmals laufen lassen meinte ich eigentlich, daß man die einzelnen befehle in schleifen packt, so daß diese jeweils z.B. 10.000 mal durchlaufen werden. Angenommen der mtime() aufruf dauert je nach auslastung ca. 10-15 zeiteinheiten , der switch befehl konstant 3 und der if befehl 1-2 - dann käme z.b. 13 für switch und 15 für if raus, obwohl if eigentlich schneller ist.
KB:knigge
Benutzeravatar
Blutgerinsel
Mitglied
Beiträge: 1801
Registriert: 19.07.2004 18:53
Wohnort: Landkreis Ulm
Kontaktdaten:

Beitrag von Blutgerinsel »

Abgesehen davon solltest du dir mal microtime(); näher anschauen und das in deine Zeitrechnung entsprechend abändern......

Im Grunde genommen müsste ein Block mit if und elseif am schnellsten sein
Antworten

Zurück zu „Coding & Technik“