System hastighed optimering

Tags:    php

<< < 12 > >>
Heey!

Jeg har siddet og programmeret på et CMS system i efterhånden lang tid nu, og forståeligt nok, så efter hånden som det hoser sig opmed flere og flere koder, bliver systemet en smule langsommere.

Jeg synes dog det er blevet en anelse for langsomt her på det seneste, og nu kunne jeg altså godt tænke mig at finde ud af hvad der gør det så langsomt.

Kender i en smart metode? Et analyse script, what ever?

Jeg kunne godt tænke mig at få en oversigt over, hvad som reducere load tiden mest muligt - og så derefter tage det til beslutning om hvorvidt man kan ændrer i koden - eller i værste tilfælde fjerne den, hvis det er en funktion som kan undværes.

Herefter ønsker jeg Jer alle en god jul og godt nytår!



12 svar postet i denne tråd vises herunder
2 indlæg har modtaget i alt 6 karma
Sorter efter stemmer Sorter efter dato
Refactoring er et stort emne, da det dækker over en masse "DOs and DON'Ts".

De bedste metoder er at time-tracking i din kode og ellers debugging som en sindssyg.

Time-tracking eller timing går ud på at tracke hvor lang tid en stump kode er om at blive udført. Hvis den er rigtig lang tid om det, kan det betale sig at skrive den om. Derefter time-tracker man den nye kode og ser om det kan betale sig at skrive den om.

Ved debugging kan du se på hvilke funktioner der bliver brugt og hvilke der ikke bliver brugt.

Når du så omskriver din kode skal du se på om du kan skrive din kode radikalt anderledes, end hvordan du gjorde det før, og suppler med hastighedstests af forskellige PHP funktioner.
Et godt råd er at kigge på dine loops. Jo mindre data du behandler i dine loops des bedre er det. Jo færre loops, des bedre. osv. :)
Husk aldrig at have en SQL kald inde i et loop. Unset dine variabler når du er færdig med dem - de bruger RAM.

Prøv evt. at kigge på Google: http://www.google.dk/search?sourceid=chrome&ie=UTF-8&q=refactoring+php

Der er nogle rigtig gode forklaringer rundt omkring.



array() burde du nok kende til hvis du kan programere "store systemer"..

Folk programere på forskellige måder, den ene kan være ligeså "rigtig" som den anden.

Ang. foreach så er det bare en anden måde at skive den på: http://php.net/manual/en/control-structures.alternative-syntax.php, de fleste bruger {}, men gør det ikke mere rigtig af den grund, den anden måde gør det "mere" læslig..





Var slet ikke klar over, at det var dumt at bruge SQL querys inde i en loop.

- Dem har jeg utallige af. Har du nogen forslag til hvordan man ellers kunne gøre det?

JOIN?

Forresten:

I følge denne guide: http://www.webdesign.org/web-programming/php/benchmark-and-optimize-php-script-speed.14875.html nævner de, at det er 7 gange hurtigere at bruge $row['id'] i stedet for $row[id] - kan det virkelig passe?



Indlæg senest redigeret d. 17.12.2010 18:55 af Bruger #16320
Det kan meget vel passe.

Ved at bruge $row[id] (uden gnyffer), så be'r du PHP om at lave en konstant der indeholder strengen 'id'. Altså bliver $row['id'] til
Fold kodeboks ind/udKode 

Altså to ekstra funktionskald før du får fat i det reelle index i det pågældende array.

Dobbeltgnyffer er også langsommere end enkelt-gnyffer, da PHP parser variabler skrevet i dobbeltgnyffer hvor strenge omsluttet med enkeltgnyffer læses som en regulær streng.

Saml så mange SQL kald til et kald. Ved f.eks generering af en træ-struktureret menu, kan du sagtens hente alle menu punkter i ét SQL kald og herefter bruge PHP til sortere alle punkterne.

JOIN kan bruges til at hente data fra to eller flere tabeller i stedet for at lave to eller flere SQL kald. Dette er gældende hvis resultaterne fra flere SQL kald kan samles til en record.

Nogle af punkterne i det link du henviser til at rigtige nok, men en del skal tages med et gran salt.



Ja tænkte det nok - noget af deres indhold virker også lidt som et dårligt tv-program.

Men hvordan vil du indsætte gnyffer i f.eks sådan en query her?

$getFront = mysql_query("SELECT * FROM `cms_sider` WHERE `id` = '$showf[id]'") or die(mysql_error());

Fordi nedestående kan jo ikke lade sig gøre:

$getFront = mysql_query("SELECT * FROM `cms_sider` WHERE `id` = '$showf['id']'") or die(mysql_error());



jeg vil nok gøre sådan:

$getFront = mysql_query("SELECT * FROM `cms_sider` WHERE `id` = '" . $showf['id'] . "'") or die(mysql_error());



Selvfølgelig - det kan jeg godt se nu :roll:

Men tak!

Ingen jeg afslutter tråden, kunne jeg godt tænke mig at vide nærmere omkring hvordan man vil kunne omformulere nedenstående kodeeksempel om til join:

Fold kodeboks ind/udKode 


Og hvad nu hvis de to tabeller deler samme navne? Som f.eks: ID?

- forresten. Nu hvor vi er ved det. Det er vel ikke muligt at inkludere enkelt gnyffer i f.eks: echo 'Oprettet af: ' . $hbi[user];



Prøv du at kigge på denne klump kode. Er der noget du ikke forstår ved det, så bør du nok kigge en masse i PHPs egen dokumentation, og bagefter i MySQLs. :)

Fold kodeboks ind/udPHP kode 




Indlæg senest redigeret d. 17.12.2010 23:40 af Bruger #10216
Ja - jeg har kunne programmere i et par år nu efterhånden, og kan programmere store systemer.

Stadig er der funktioner som jeg ikke kender til eller aldrig bruger. F.eks array() - har aldrig brugt det. Regex, bruger det - men kan intet af det i hovedt som alt andet. Og måden du programmere på er også en del anderledes i forhold til min måde kan jeg se.

Er det virkelig "den eneste rigtige måde"?

Du bruger f.eks endforeach;, i stedet for at dele det op i { og }.

Kunne rigtig godt tænke mig at vide mere, siden du lyder som en erfaring PHP-Programmør.




Som zynzz er inde på er der ingen rigtige måder at programmere på. Men der findes generelle retningslinjer som man bør følge hvis man planlægger at andre skal ændre i koden.

Jeg skriver udelukkende OO PHP og bygger mine systemer rundt om frameworks.

De alternative control structures er typisk dem man bruger til PHTML. Et relativt nyt genopfundet template sprog som skrives i alm. PHP, hvor man dog benytter disse alternativer.



<< < 12 > >>
t