Avatar billede jacks222 Nybegynder
29. december 2009 - 13:30 Der er 17 kommentarer og
1 løsning

Slamkode? Gider du optimerer?

Er dette dårlig kode? Er der en som gider optimerer det, så det løber hurtigere? (Jeg danner en tabel med 40 celler (4 bred x 10 høj) og henter et billede samt et link ind i hver celle fra et array). Scriptet virker, men det kan sikkert optimeres :)

<?php

echo "<table width=\"100%\" border=\"0\" cellpadding=\"0\" cellspacing=\"3\"><tr>";

for ( $counter = 0; $counter <= 39; $counter += 1) {

echo "<td><div align=\"center\"><a href=\"$all_links[$counter]\" target=\"blank\"><img src=\"thumbs/$all_images[$counter].jpg\" width=\"220\" height=\"160\" border=\"0\" /></a></div></td>";

switch($counter){
case 3: echo "</tr><tr>"; break;
case 7: echo "</tr><tr>"; break;
case 11: echo "</tr><tr>"; break;
case 15: echo "</tr><tr>"; break;
case 19: echo "</tr><tr>"; break;
case 23: echo "</tr><tr>"; break;
case 27: echo "</tr><tr>"; break;
case 31: echo "</tr><tr>"; break;
case 35: echo "</tr><tr>"; break;
case 39: echo "</tr></table>"; break;
}
}

?>
Avatar billede repox Seniormester
29. december 2009 - 13:45 #1
Mit bud kan ses her: http://php.pastebin.com/m54ef84c7
Avatar billede repox Seniormester
29. december 2009 - 13:46 #2
Og for at være pernitten; linie 20 i mit forsøg en indentering for meget.
Avatar billede jacks222 Nybegynder
29. december 2009 - 13:57 #3
Jeg syntes du åbner og lukke <?php> mange gang - gør det ikke skidtet langsomere?

Counteren skal start på 0 da arrayet starter på 0. Jeg prøvede også med nogle løkker i løkker og lagde fra og til. Til sidste gav jeg op. Måske man bare kan trække 1 fra der hvor man skriver det i cellen.
Avatar billede repox Seniormester
29. december 2009 - 14:12 #4
Sådan der, så: http://php.pastebin.com/m47f0d655

Har du nogen grund til at tro at det at åbne og lukke PHP gør parseren langsom? Eller er det bare en tilfældig strøtanke du har fået?
Uanset, så er det en tåbelig ting at gå op i, med så små scripts som disse. Jeg tror ikke engang jeg har hørt andre end dig gå op i det i nogen som helst form for systemer, så det undrer mig lidt at det er noget du bekymrer dig om...

Du burde fokusere mere på at skrive pæn kode end at have fokus på hastigheden af dine scripts, når applikationen er så lille.
Avatar billede ksoren Nybegynder
29. december 2009 - 14:21 #5
Performancemæssigt er det bedste at udskrive så få gange som muligt. Og så ville jeg bruge to forløkker til sådan en opgave


$result = '<table width="100%" border="0" cellpadding="0" cellspacing="3">';

for ($counter=0,$i=0; $i<1; $i++){
    $result .= '<tr>';

    for($j=0; $j<1; $j++,$counter++){
        $result .= '<td><div align="center">';
        $result .= '<a href="'.$all_links[$counter].'" target="blank"><img src="thumbs/'.$all_images[$counter].'.jpg"';
        $result .= ' width="220" height="160" border="0" /></a></div></td>';
    }

    $result .= '</tr>';
}

$result .= '</table>';

echo $result;
Avatar billede ksoren Nybegynder
29. december 2009 - 14:30 #6
Min i og j tællere skal så lige justeres lidt :)

i tæller rækker, j tæller kolonner
Avatar billede repox Seniormester
29. december 2009 - 14:32 #7
here we go again...

#5
Har du nogen dokumentation der understøtter den påstand om performance eller er det en stråmand?

For ellers synes jeg da også vi skal gå op i performance benchmarking i single og double quotes, concatenation samt PHP's hukommelsesbrug i forbindelse med concatenation af dine strenge...
Avatar billede ksoren Nybegynder
29. december 2009 - 14:36 #8
Du kan prøve at skrive et script, som udlæser en fandens masse data. Så kan faktisk selv dokumentere det.
Avatar billede repox Seniormester
29. december 2009 - 14:44 #9
Det er prøvet; ikke nogen nævneværdig forskel - benchmarking giver en forskel på under 0,01% - men hvis du har nogle referencer til tal eller eksempler der kan give et andet resultat, ser jeg dem gerne.

Alt uden for <?php ... ?> bliver alligevel echo'et ud, så jeg kunne næppe forestille mig du kan finde noget som giver en nævneværdig forskel...
Avatar billede ksoren Nybegynder
29. december 2009 - 15:00 #10

<?php
//  1000 rækker
//    10 kolonner

function microtime_float(){
  list($usec, $sec) = explode(" ", microtime());
  return ((float)$usec + (float)$sec);
}


function test1(){
    $beg = microtime_float();

// ****************************************************************
?>
<table width="100%" border="0" cellpadding="0" cellspacing="3">
    <tr>
        <?php for ( $counter = 0; $counter <= 10000; $counter++ ): ?>
        <td>
            <div align="center">
                <a href="<?php echo "link" ?>" target="_blank">
                    <img src="thumbs/<?php echo "image"; ?>.jpg" width="220" height="160" border="0" />
                </a>
            </div>
        </td>
        <?php
            if( (($counter + 1) % 4) == 0 )
            {
                if( $counter == 39 )
                    echo "\n\t</tr>\n";
                else
                    echo "\n\t</tr>\n\t<tr>\n";
            }

            endfor;
        ?>
</table>
<?php
// ****************************************************************
    return microtime_float() - $beg;
}

function test2(){
    $beg = microtime_float();
// ****************************************************************
$result = '<table width="100%" border="0" cellpadding="0" cellspacing="3">';

for ($counter=0,$i=0; $i<1000; $i++){
    $result .= '<tr>';

    for($j=0; $j<10; $j++,$counter++){
        $result .= '<td><div align="center">';
        $result .= '<a href="'.'link'.'" target="blank"><img src="thumbs/'.'image'.'.jpg"';
        $result .= ' width="220" height="160" border="0" /></a></div></td>';
    }

    $result .= '</tr>';
}

$result .= '</table>';

echo $result;
// ****************************************************************

    return microtime_float() - $beg;
}
// -----------------------------

//echo "tid for test 1 = ".test1()."<br>";
echo "tid for test 2 = ".test2()."<br>";
?>


resultatet blev:

tid for test 1 = 7.4419000148773
tid for test 2 = 0.0648758411407
Avatar billede repox Seniormester
29. december 2009 - 18:47 #11
Så du mener at en forskel på 6-7 mikrosekunder er værd at optimere efter og er så målbar en grad at det er værd at skrive effektiv kode efter? Eller ville du bare pointere hvad jeg har konstateret; at der er en målbar forskel, men forskellen er så lille at det er decideret tåbeligt at gå op i?

Jeg var faktisk så heldig at kunne måle en forskel på op til 12 mikrosekunder! Vildt, ik'?
Avatar billede Slettet bruger
29. december 2009 - 19:14 #12
Avatar billede repox Seniormester
29. december 2009 - 19:16 #13
#12
;)
Avatar billede intenz Novice
29. december 2009 - 21:05 #14
#12 haha

Som der bliver sagt, så lad være med at optimere sådan nogle småting. Det betyder ikke noget nævneværdigt.

Hvis du skal optimere noget, så optimer din database, cache dit database output eller lign. Det giver noget, de par tusinddele af millisekunder du sparer ved det her er ligegyldige.

Om noget tager 0,007 eller 0,0001 sekund betyder ikke noget (og de tal der bliver slynget ud er ved 10.000 gentagelser, ikke ved 40. Så du kan selv dividere det ned og se om det kan betale sig at bruge en halv time på at optimere dit script (samlet optimering ca. 0.0000276 sekunder)).
Avatar billede jacks222 Nybegynder
30. december 2009 - 10:41 #15
ksoren2 smid et svar :)
Avatar billede repox Seniormester
30. december 2009 - 18:04 #16
#15
Af ren nysgerrighed; vælger du hans svar fordi det er det mest optimale i forhold til det tidsmæssige load?
Avatar billede jacks222 Nybegynder
07. januar 2010 - 15:21 #17
#16 Yeps, med 200k-300k daglige hits så har alt betydning. Især hvis skidtet skal vokse.

ksoren2, sig til hvis du vil have point, men nu lukker jeg altså.
Avatar billede repox Seniormester
07. januar 2010 - 15:34 #18
#17
Godt så :p
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester