webForumDet fria alternativet

Att optimera sin källkod

10 svar · 955 visningar · startad av vic

vicMedlem sedan apr. 2006244 inlägg
#1

Hej! JAg har hittat lite info om hur man gör för att optimera sin kod om så behövs.

1. Avoid functions if not necessary
2. Use an Optimizer
a) Zend Performance Suite comes with Zend Optimizer bundled ($)
b) IonCube's PHP Accelerator
c) Alternative PHP Cache (APC)
3. RTFM
Use: echo "Foo ", somefunc(), " Bar";
Not: echo "Foo " . somefunc() . " Bar";
4. Get your loops right first (most effective)
a) Dont call functions in condition
b) No loop-invariants (ie calcultating static values each iteration)
c) Pre-increment where possible (++$i instead of $i++)
5. Free resources. Use unset(), mysql_free_result()
6. Use the most verbose error level, E_ALL, to track even minor optimizations
7. Disable the extensions you don't use
8. Keep PHP up to date, however:
The early bird may get the worm, but the second mouse gets the cheese.
9. Cache array data (ie in a variable outside a loop, se 4b)
10.Compress your output
a) enable output buffering
b) Use gzip compression for the buffers
(set output_buffering to 1 and output_handler to ob_gzhandler in php5.ini)
11.Don't use CGI
12.Don't use dl()
13.Debug your code (error generation takes time and resources)
14.Cache your pages
15.Use persistent connections ( mysql_pconnect() rather than mysql_connect() )
16.Take advantage of new features, ie:
Use: $contents = file_get_contents("test.txt")
Not: $contents = implode("\n", file("test.txt"))
17.Avoid mod_access if you can (no .htaccess files)
18.Or, at least, dont have too many subdirectories

Stämmer alla dessa punkter? Jag trodde bla att man skulle försöka göra funktioner av så mycket som möjligt men enligt artikelln ska man undvika att köra på funktioner?

Nån som har något att tillägga?

Mvh

Vic

sl0kMedlem sedan maj 2005562 inlägg
#2

vic skrev:

Stämmer alla dessa punkter? Jag trodde bla att man skulle försöka göra funktioner av så mycket som möjligt men enligt artikelln ska man undvika att köra på funktioner?

Donald Knuth skrev:

Premature optimization is the root of all evil (or at least most of it) in programming.

Källa: http://en.wikiquote.org/wiki/Donald_Knuth

Så länge du inte har tusentals besökare/sek och gör funktionsanrop i loopar kommer du inte märka ngn betydlig skillnad ...

Motsatsen är snarare att föredra .. att kapsla in kod i funtioner/klasser i så stor grad som möjligt vilket ökar översikten och återanvändbarheten av din kod.

15.Use persistent connections ( mysql_pconnect() rather than mysql_connect() )

Nej, så länge du inte har väldigt mkt trafik och använder mysql_pconnect() korrekt är mysql_connect() bättre att använda.
mysql_pconnect() kan lätt ta mkt resurser och skapar mer problem, speciellt om du är på ett delat webbhotell lr dyl.

I övrigt är det mesta bra att tänka på ...
http://en.wikipedia.org/wiki/Software_optimization

/red så nu fick jag med det jag tänkt från början...

spangoMedlem sedan juni 20008 205 inlägg
#3

vic skrev:

Stämmer alla dessa punkter? Jag trodde bla att man skulle försöka göra funktioner av så mycket som möjligt men enligt artikelln ska man undvika att köra på funktioner?

Nån som har något att tillägga?

En hel del. Var har du hittat artikeln? Nu har jag ingen superkoll på exakt hur olika PHP-motorer funkar, men framför allt tips 1 är helt käpprätt, i enlighet med sl0ks Knuthcitat. Förvisso genererar funktionsanrop en del overhead, men nyttan det innebär att strukturera upp koden övervinner den lilla prestandaförlusten i nästan alla sammanhang, särskilt i ett dynamiskt språk som PHP, och särskilt i en webbapplikationsmiljö där CPU-belastning lätt kan kompenseras med lastdelning.

Tips 3 och 4 är väl vettiga, men lär inte göra någon enorm skillnad.

Att stänga av moduler man inte använder och att frigöra resurser är är helt rätt.

Det vettigaste tipset (förutom att låta bli att köra PHP som CGI, vilket inte ens borde behöva nämnas) är cachning och att använda optimerare. Optimerare, eftersom datorer i det långa loppet är bättre på att optimera än människor, och cachning, eftersom en sida som hämtas från cachen är en sida som din server inte behöver producera, och för att återigen citera Knuth (tror jag), "den effektivaste koden är den som inte körs". Helst ska man ha objektcachar som ligger mellan applikationslagret och databasen, eftersom databasen är det som verkligen har potential att sega ner (I/O-operationer är dyrare än CPU-cykler).

FuelMedlem sedan okt. 20001 285 inlägg
#4

...

Andreas123Medlem sedan juli 200435 inlägg
#5

Fuel skrev:

hmm, hade inte en aning om att det gick använda kommatecken

Use: echo "Foo ", somefunc(), " Bar";
Not: echo "Foo " . somefunc() . " Bar";

Förstår inte vad vinsten skulle vara heller och jag tycker punkter ser bättre ut i koden

Det där visste inte jag heller till, intressant, skulle gärna vilja veta hur PHP behandlar dom.

spangoMedlem sedan juni 20008 205 inlägg
#6

Det är som flera argument till en funktion. echo loopar då genom listan av argument och skriver ut dem ett efter ett istället för att konkatenera en massa strängar till en och sen skriva ut den. Strängkonkatenering är en kostsam operation som orsakar en massa slafsande av minne fram och tillbaka.

sl0kMedlem sedan maj 2005562 inlägg
#7

Andreas123 skrev:

Det där visste inte jag heller till, intressant, skulle gärna vilja veta hur PHP behandlar dom.

Förklaring på opcode nivå.
http://blog.libssh2.org/index.php?/archives/28-How-long-is-a-piece-of-string.html

vicMedlem sedan apr. 2006244 inlägg
#8

spango skrev:

En hel del. Var har du hittat artikeln? Nu har jag ingen superkoll på exakt hur olika PHP-motorer funkar, men framför allt tips 1 är helt käpprätt, i enlighet med sl0ks Knuthcitat. Förvisso genererar funktionsanrop en del overhead, men nyttan det innebär att strukturera upp koden övervinner den lilla prestandaförlusten i nästan alla sammanhang, särskilt i ett dynamiskt språk som PHP, och särskilt i en webbapplikationsmiljö där CPU-belastning lätt kan kompenseras med lastdelning.

Tips 3 och 4 är väl vettiga, men lär inte göra någon enorm skillnad.

Att stänga av moduler man inte använder och att frigöra resurser är är helt rätt.

Det vettigaste tipset (förutom att låta bli att köra PHP som CGI, vilket inte ens borde behöva nämnas) är cachning och att använda optimerare. Optimerare, eftersom datorer i det långa loppet är bättre på att optimera än människor, och cachning, eftersom en sida som hämtas från cachen är en sida som din server inte behöver producera, och för att återigen citera Knuth (tror jag), "den effektivaste koden är den som inte körs". Helst ska man ha objektcachar som ligger mellan applikationslagret och databasen, eftersom databasen är det som verkligen har potential att sega ner (I/O-operationer är dyrare än CPU-cykler).

- Skulle man kunna få ett exempel på en bra optimerar?

sl0kMedlem sedan maj 2005562 inlägg
#9

vic skrev:

- Skulle man kunna få ett exempel på en bra optimerar?

2. Use an Optimizer
a) Zend Performance Suite comes with Zend Optimizer bundled ($)
b) IonCube's PHP Accelerator
c) Alternative PHP Cache (APC)

...

spangoMedlem sedan juni 20008 205 inlägg
#10

vic skrev:

- Skulle man kunna få ett exempel på en bra optimerar?

red. D'oh! Läste fel. Men ändå, jag kom med fina tips här nedan...

Det bästa sättet är att göra en schysst struktur till en början, utan att bry sig alltför mycket om mikrooptimering. Se till att saker och ting är väl uppdelade så att du lätt kan ändra i en del av programmet utan att det påverkar andra delar alltför mycket (eller ens alls). Se till att göra de stora optimeringarna, håll inte på resurser längre än du behöver, plocka inte fram mer än du behöver, plocka fram allt du behöver på en gång (detta är naturligtvis bara riktlinjer - om du kan få en mycket renare struktur genom att selecta fram några fler fält i en SQL-fråga än du faktiskt behöver, är det antagligen värt det).

Sen kan man börja gå igenom databasen. Undersök dina SQL-frågor (i MySQL gör man det med EXPLAIN) och lägg till index på de kolumner/nycklar som behöver det.

Tycker man därefter att prestandan inte är tillräcklig, ska man börja titta på vad det faktiskt är som kostar exekveringstid. Profilerare fantastiska verktyg, som visar exakt vilka funktioner, eller till och med rader, som programmen spenderar mest tid på. Då vet du precis vilka delar som det är värt att lägga ner mest tid på att optimera.

liljaMedlem sedan juli 20041 183 inlägg
#11

4an tycker jag är helt rätt.

Se till att skapa effektiva loopar från början och inga "brute force"-algoritmer.

Det är framförallt effektiva algoritmer för att göra olika saker man får lära sig i skolan. Eller i falla vad jag fått lära mig :) Ett sätt att mäta effektiviteten i algoritmer är med hjälp utav BigO. http://en.wikipedia.org/wiki/Big_O_notation

Det är dock rätt krångligt!

131 ms totalt · 3 externa anrop · v20260731065814-full.fb544a5a
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
128 ms — hämta tråd, inlägg och bilagor (db)