Kuten otsikko kertoo, niin tarkoitus on hieman viritellä tiedon tulostusta ruudulle.
Mietin, että jos minulla on 5 riviä jotka tulostan selailijan ruudulle, niin periaatteessa 5 * echo on hitaampi kuin 1 * echo. Joiden juttujen mukaan ob_flush ja vastaavat nopeuttaisivat prosessia, mutta mikä on Putkan käyttäjien näkemys asiasta? Okei, kysymys on jostain sekunnin miljoonasosista varmasti, mutta sekin on jo jotain ja pienistä asioistahan se kokonaisuus koostuu. ;)
Sitten kysymys: kuinka tulostan tekstin pystyasennossa? Eli normaalisti tulostetaan aina vaakaan, mutta tarvitsen ison taulukon ja tilan säästämiseksi leveyssuunnassa pitäisi tulostaa tekstiä pystyyn. Eli havainnollistan hieman: jotta pystyisin lukemaan tämän pystysuunnassa olevan tekstin kuten normaalisti, niin paperia pitäisi kääntää 90 astetta joko oikealla tai vasemmalle.
Kysymykset on esitetty, keskustelu alkakoon.
5 echoa on todellakin hitaampi kuin 1 echo.
50 * 5 * echo vei aikaa 0.00034404s kun taas
50 * 1 * echo vei aikaa 0.00028801s.
Tein pienen testin yhdessä ylläpitämässäni järjestelmässä.
Tein samanlaisen haun tietokantaan 10 kertaa kaikilla tavoilla.
Tuloksena palautuu 100 riviä tietokannasta ja muuta sälää eli seassa on monta tietokantakyselyä sekä jonkin verran tekstiä.
Tavassa 1 ei käytetty ob_start ja ob_end_flush. Eli perinteinen echo ja sitten taas tehdään erinäisiä operaatioita kuten tietokantakyselyitä. Sivun luonti kesti n. 0.07 sekuntia.
Tavassa 2 lisättiin sivun alkuun ennen kaikkia muita ob_start sekä sivun viimeiseksi riviksi ob_end_flush. Tuloksena 0.0065 sekuntia keskimäärin.
Tavassa 3 laitettiin ensimmäiseksi riviksi ob_start('ob_gzhandler') ja viimeiseksi ob_end_flush. Tuloksena sivun tulostus kesti 0.0078 sekuntia keskimäärin.
Eli tapa 2 oli ehdottomasti nopein. Tapa kolme on hyvä jos haluaa säästää linjakapasiteettia ja palvelimesta löytyy paljon 'ylimääräistä' CPU tehoa.
Tapa 3 menee allekirjoittaneella historiaan, koska se on tämän pienen testin perusteella 10 kertaa hitaampi. Voi tätä onnistumisen iloa!
Noh, sitten pitää vielä löytää lisää nopeutta eli ei muuta kuin tietokantakyselyiden pariin ja MySQL:n viritystä.
Käyttäjä tuskin pystyy huomaamaan, menikö sivun luomiseen 0,07, 0,007 vai 0,0007 sekuntia. Jos sivu tuntuu liian hitaalta, täytyy nopeuttaa jotain muuta kuin tulostusta. Tosin kuvaamasi kymmenkertainen ero on yllättävän suuri. Ja ei siitä tietenkään haittaa ole, jos sivun muodostaminen on hivenenkin nopeampaa kuin ennen.
Wizard kirjoitti:
Sitten kysymys: kuinka tulostan tekstin pystyasennossa?
Luulenpa, että HTML-sivun teksti voi olla pelkästään vaakasuunnassa. Jos tekstin on pakko olla käännettynä 90 astetta, sinun täytyy luoda tekstiä vastaava kuva. Tilanpuutteeseen toinen ratkaisu voisi kyllä olla tekstin lyhentäminen tai taulukon suunnittelu uudelleen.
Antti Laaksonen kirjoitti:
Käyttäjä tuskin pystyy huomaamaan, menikö sivun luomiseen 0,07, 0,007 vai 0,0007 sekuntia. Jos sivu tuntuu liian hitaalta, täytyy nopeuttaa jotain muuta kuin tulostusta. Tosin kuvaamasi kymmenkertainen ero on yllättävän suuri. Ja ei siitä tietenkään haittaa ole, jos sivun muodostaminen on hivenenkin nopeampaa kuin ennen.
Täytyy myöntää, että kun itse noita asioita testailin, niin tuon eron kyllä huomasi. Vaikka ero on vain sekunnin osia, niin silti.
Osittain olen huomannut, että kun otin käyttöön PHP5 ja Zend Optimizerin, niin koko kyseinen sivusto on saanut uutta potkua. Edellisessä saman järjestelmän versiossa sivun luonti kesti lähes puoli sekuntia (siis hyvin pitkään), mutta kun kävin koko koodin läpi eli tarkastin silmukat, muuttujat, vaihdoin printin echoon ja nyt lisäsin ob:t, niin sivu muodostetaan lähes 100 kertaa nopeammin kuin ennen. Voisin pitää tätä erittäin merkittävänä muutoksena.
Antti Laaksonen kirjoitti:
Luulenpa, että HTML-sivun teksti voi olla pelkästään vaakasuunnassa. Jos tekstin on pakko olla käännettynä 90 astetta, sinun täytyy luoda tekstiä vastaava kuva. Tilanpuutteeseen toinen ratkaisu voisi kyllä olla tekstin lyhentäminen tai taulukon suunnittelu uudelleen.
Olen nähnyt näitä toteutuksia jossakin, mutta en enää millään löydä niitä. Ja nimenomaan niissä taisi olla se tekstinä eikä kuvana. Tosin saattaa olla, että se olisi ollut sitten kuva. Ajattelin vain, että jos joku sattuisi tietämään, mutta pitänee alkaa googlettamaan ja hakemaan...
Taulukon suunnittelu on vaikeaa, koska kyseessä on taulu jossa jokaisessa sarakkeessa tuplaantuu solujen määrä verrattuna vasemmalla olevaan sarakkeeseen. Eli jos ensimmäisessä sarakkeessa on 2 solua, toisessa on neljä, kolmannessa 8 jne jne. Maksimi on 10 saraketta. Sen takia tekstin voisi kääntää vasemmassa reunassa pystyyn jolloin säästetään ainakin leveydessä.
Wizard kirjoitti:
Täytyy myöntää, että kun itse noita asioita testailin, niin tuon eron kyllä huomasi.
Heh, ei tuollaista eroa voi ihmismieli huomata, sanoohan sen nyt jo järkikin :)
Kyllä sen huomaa jos vain on riittävän pitkät sivulistaukset (esim. edellämainittu SQL hakulistaus). Pienet ja lyhyet sivut ovat asia erikseen.
Wizard kirjoitti:
Olen nähnyt näitä toteutuksia jossakin, mutta en enää millään löydä niitä. Ja nimenomaan niissä taisi olla se tekstinä eikä kuvana. Tosin saattaa olla, että se olisi ollut sitten kuva. Ajattelin vain, että jos joku sattuisi tietämään, mutta pitänee alkaa googlettamaan ja hakemaan...
Samoin. Saattoivat olla kuvia, mutta melkein väittäisin että ei.
Voisi olla itsellekkin käyttöä, joten muista mainita, jos löydät kätevän keinon.
Ei onnistu, PHP:n kuvafunktioilla kylläkin.
Printin vaihtaminen echoksi höylää siis aikaa pois, koska funktiossa oon yksi merkki vähemmän. Nyt minä tämän vasta keksin.
echo ei palauta mitään arvoa kun taas print palauttaa, mikä tekee siitä echoa hitaamman. Näin joku sen sanoi, muuten en ole tutkinut. Enpäs kyllä mene takuuseen tuosta yhden merkin tärkeydestä. Tein funktiot
doMath1 ja doMath01 ja looppasin niitä 100 * 10000 looppia läpi ja otin ajat talteen. doMath01 näytti olevan välillä nopeampi välillä hitaampi. Testituloksiin vaikuttaa tietysti moni muuttuja, mikä tekee absoluuttisesta varmuudesta käytännön keinoin varsin hankalaa. Pitäisi tuntea tulkin toimintaperiaate.
Tässä on pieni juttu printistä ja echosta, linkin nappasin php.net sivulta:
http://www.faqts.com/knowledge_base/view.phtml/
Ja sielläkín sanotaan, että echo on hieman nopeampi kuin print...
Viisas mies ei optimoi koodia.
Optimoinnin säännöt:
1. Älä optimoi.
2. (vain experteille) Älä optimoi vielä.
"We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil."
- Donald Knuth
"More computing sins are committed in the name of efficiency (without necessarily achieving it) than for any other single reason - including blind stupidity."
- W.A. Wulf
Pitää ajatella mittasuhteita. Jos ohjelmoi yhtä tehokkaalle tai tehokkaammalle kuin tavankin pc niin sillon ei ole mitään väliä, mutta jos ohjelmoi legorobottiin palvelinta (vai mikähän se oli..) niin siinä pitää jo hieman optimoida. Ohjelma kuulemma kaatui stringiä käytettäessä kun muisti ei riittänyt stringin merkkien läpi käymiseen :).
Jos joku kaipaa apuja siihen, että kuinka käännetään tekstiä, niin lukaistoon seuraavan sivun:
http://www.w3.org/TR/2003/CR-css3-text-20030514/#text-layout
Siitä on hyvä lähteä. Toimivuus tietysti hieman vajaata, mutta omien testien mukaan aika hyvä yhteensopivuus ollut.
Wizard kirjoitti:
http://www.w3.org/TR/2003/CR-css3-text-20030514/#text-layout
Thäh? Tukeeko noita muka jo oikeasti joku selain? o_O
Lievä yllätys, mutta M$ Internet Explorer tukee. Tekstin kääntö on vaivatonta. Tosin mikään muu selain ei oikeastaan noita tuekaan joten se siitä hyvästä yhteensopivuudesta siis.
Joskus Mikkisofta jaksaa yllättää. Muut selaimet varmasti tulevat perästä jossain vaiheessa. Itse käytän tuota metodia eräässä palvelussa ja muut kuin Explorerin käyttäjät saavat lukea tietoja PDF -tiedostoista jotka järjestelmä tekee lennossa. Raskaampi, mutta toimiva vaihtoehto.
Aihe on jo aika vanha, joten et voi enää vastata siihen.