[HTML/PHP] <br /> duurt extreem veel langer dan \n ?!?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben tegen iets raar aangelopen. Ik moet redelijk grote hoeveelheden data uitprinten. Basically zijn het een x aantal html-tabellen van 30 kolommen breed en 1 rij hoog. Eigenlijk zouden het 10 rijen moeten zijn, maar wegens legacy code, worden de waardes nu in "juiste rij" geplaatst door line breaks ervoor toe te voegen.

Aanvankelijk was de output pdf en werden daarom \n linebreaks gebruikt. Nu moet ik een HTML versie maken en moet ik <br /> gebruiken. Uiteindelijk zitten er in totaal ongeveer +/- 300 line breaks in een tabel.

Hier komt dan ook gelijk mijn probleem naar voren. Zodra ik <br /> gebruik als linebreaks laadt de pagina 10x langzamer. Eerst dacht ik dat het aan de code lag, maar als ik de inhoud van de kolommen niet uitprint laden beide type linebreaks even snel. Echter zodra ik het output is er echt een enorm performance verschil. Ik heb nl2br() geprobeert, maar daar wordt het even sloom van.

Dit gebeurt in Firefox 3.1 en Safari 4. Dat suggereert weer dat het niet aan de browser ligt, aangezien het twee verschillende rendering engines zijn. Iemand enig idee of er een "issue" is met pagina breaks? Is er iets speciaals waar ik rekening mee moet houden?

Alvast bedankt!
Eelke

PS Ik wil best de code posten, maar aangezien het nogal veel code is, doe ik dat als blijkt dat niemand een idee/suggestie heeft aan de hand van dit verhaal :)

Acties:
  • 0 Henk 'm!

Verwijderd

Gebruik je ook echt HTML tabellen als in <table>? Tabellen worden gerenderd met vrij geavanceerde algoritmes om de breedte van kolommen te bepalen. Hoe meer rijen en kolommen, hoe zwaarder het zal zijn. Ik kan me voorstellen dat die <br> tags het berekenen lastiger maken omdat per cel nog weer de langste regel moet worden gezocht.

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Je zult eerst moeten achterhalen wat er precies langzaam is. Is het het outputen vanuit PHP of is het echt het renderen van de pagina in de browser.

Probeer de output die je hebt eens in een statische html pagina te zetten, en kijk dan of het nog steeds langzaam is. Als het dan nog langzaam is, is het dus blijkbaar toch een client-side probleem. Anders zul je moeten proberen te achterhalen, welk gedeelte van je script er langzaam is.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ja, ik gebruik <table>.

denk je dat de performance toe zal nemen als ik ipv 1 rij met line breaks 10 rijen maak? (dit afgezien van het dat het gebruik van linebreaks niet netjes, juist, etc. is:P)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
@woy

goed idee, dat ga ik proberen

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
@woy

als ik de bestanden opsla nadat ik ze geladen heb is er geen verschil in de pagina's met tabellen die <br /> of \n bevatten. ze laden allebei in een oogwenk. er is ook maar 12KB verschil (+/- 2000 <br />-tags verdeeld over 10 tabellen).

ik zal nu de code posten.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Voor elke tabel wordt de volgende code uitgevoerd. Elke kolom is een datum. Voor elke datum wordt getGeschrevenTijdLijstje() aangeroepen (zie volgende blok).

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        for ($tellerDatum = $theBeginDatum; $tellerDatum->isEerder ($theEindDatum); $tellerDatum = $tellerDatum->getVolgendeDag ($tellerDatum)) {
            if ($tellerDatum->isEerder ($this->eindDatum)) {
                //vul kolom data
                $nieuweData["datum".$tellerDatum->getStamp()] = $this->getGeschrevenTijdLijstje ($tellerDatum, $tellerDatum->getVolgendeDag(), $theClient, $theSoortOverzicht, "", "html");
            }
        }

        //data uitprinten
        echo "<table border=\"1\" cellpadding = \"2\" cellspacing=\"0\"";

        echo "<tr>";
        foreach (array_keys ($dataCols) as $colKey) {
            print "<td>".$nieuweData[$colKey]."</td>";
        }
        echo "</tr>";

        echo "</table>";


De onderstaande functie levert de data aan voor een kolom. Rijen worden nu nog gescheiden door $break te printen. Als die op "<br />" staat ingesteld, wordt het allemaal gigantisch sloom.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
function getGeschrevenTijdLijstje ($theBeginDatum, $theEindDatum, $theClient, $theSoortOverzicht, $theSoortLijstje, $outputType = "pdf") {
        $break = "\n";
        if ($outputType == "html")
            $break = "<br />";

        //bepaal welke functies weergegeven moeten worden
        $indicatieLijst = $this->algemeneFunctieKlasseOverzicht->getFunctiesVoorOverzicht($theSoortOverzicht); 
        
        $indicatieLijst->resetArrayIndex();
        $geschrevenTijdTotaal = new DatumTijd(0);
        $indicatieOverheadTotaal = new DatumTijd(0);
        $returnString = "";
        $indicatieLijst->resetArrayIndex(); 

        //haal geschreven tijd op voor verschillende "functies" en "klassen"
        while ($indicatie = $indicatieLijst->getItemFromArray()) {
            $geschrevenTijdContact = $theClient->getGeschrevenFunctieContact($theBeginDatum, $theEindDatum, $indicatie->getFunctieAfkorting ());
            $geschrevenTijdVerslag = $theClient->getGeschrevenFunctieVerslaglegging($theBeginDatum, $theEindDatum, $indicatie->getFunctieAfkorting ());
            
            if ($indicatie->getTijdschrijvenContact()) {
                $returnString .= $geschrevenTijdContact->getTijdschrijfTijd();
                $geschrevenTijdTotaal = $geschrevenTijdTotaal->telOp($geschrevenTijdContact);
                $returnString .= $break;
            }
            if ($indicatie->getTijdschrijvenVerslag()) {
                $returnString .= $geschrevenTijdVerslag->getTijdschrijfTijd();
                $geschrevenTijdTotaal = $geschrevenTijdTotaal->telOp($geschrevenTijdVerslag);
                $returnString .= $break;
            }
            $indicatieOverheadTotaal = $indicatieOverheadTotaal->telOp($theClient->getIndicatieOverheadInterval ($theBeginDatum, $theEindDatum, $indicatie->getFunctieAfkorting ()));
        }

        $returnString .= $break."<b>".$geschrevenTijdTotaal->getTijdschrijfTijd()."</b>";
        return $returnString;
    }

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
@eboezeman: Als je nog iets wil toevoegen aan je post, en er heeft nog niemand na je gepost, gebruik dan de Afbeeldingslocatie: http://tweakimg.net/g/forum/images/icons/edit.gif-knop. Je topic 4x achter elkaar omhoog schoppen is onnodig (zie ook topickick binnen 24 uur)

[ Voor 5% gewijzigd door RobIII op 08-03-2009 15:40 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
<snip>
Als je iets aan te merken hebt op moderatie dan zijn daar topics voor...
Verwijderd schreef op zondag 08 maart 2009 @ 15:14:
Voor elke tabel wordt de volgende code uitgevoerd. Elke kolom is een datum. Voor elke datum wordt getGeschrevenTijdLijstje() aangeroepen (zie volgende blok).

PHP:
1
-


De onderstaande functie levert de data aan voor een kolom. Rijen worden nu nog gescheiden door $break te printen. Als die op "<br />" staat ingesteld, wordt het allemaal gigantisch sloom.

PHP:
1
-
Alleen het zetten van $outputType == "html" zorgt voor een factor 10 vertraging in de uitvoer van het script :o ? Kun je eens met een scriptje meten welk stuk voor de vertraging zorgt? Eventueel heel simpel voor een var_dump(time()); of var_dump(microtime()); voor en na elke functie-aanroep te zetten. Dan kun je zien welk deel van je script er zo lang over doet.

Het lijkt me stuk dat alleen dat $outputType == "html" zorgt voor je vertraging. Als er nu eens van maakt: $break = "a" in plaats van $break = "<br />", is het dan ook trager? En met $break = "aaaaa" ?

[ Voor 21% gewijzigd door RobIII op 08-03-2009 16:45 ]

Pagina: 1