/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
overdrevet brug af funktioner?
Fra : Stig Nørgaard Jepsen


Dato : 22-01-02 14:08

Det kan godt være at det er et lidt underligt spørgsmål, men jeg prøver
alligevel.

Kan man ha' et overdrevet forbrug af funktioner, som kan koste perfomance i
det lange løb?

Det er sådan, at jeg har noget kode, hvor der en masse ting der gentager
sig. Her har jeg erstattet en del af koden med små funktioner (som bygger på
det fjernede kode selvf.). Det gør at koden bliver langt mere overskuelig,
og det derfor bliver nemmere at forstå hvad der sker(især når man giver de
rigtige navne til funktionerne).

Er der nogen performancemæssig straf for at bruge en funktion, istedet for
at skrive koden direkte istedet?

/Stig



 
 
Niels Andersen (22-01-2002)
Kommentar
Fra : Niels Andersen


Dato : 22-01-02 14:55

"Stig Nørgaard Jepsen" <stigen@mail.dk> wrote in message
news:3c4d63e2$0$227$edfadb0f@dspool01.news.tele.dk...
> Er der nogen performancemæssig straf for at bruge en funktion, istedet for
> at skrive koden direkte istedet?

Ja, det er der. Spørgsmålet er, om den er væsentlig. Jeg tror det skal være
en *meget* special situation (hvor meget dårligt design indgår), før det er
væsentlig.

--
Mvh.

Niels Andersen



Mogens Meier Christe~ (22-01-2002)
Kommentar
Fra : Mogens Meier Christe~


Dato : 22-01-02 15:36

"Stig Nørgaard Jepsen" <stigen@mail.dk> wrote in message
news:3c4d63e2$0$227$edfadb0f@dspool01.news.tele.dk...

> Kan man ha' et overdrevet forbrug af funktioner, som kan koste perfomance
i
> det lange løb?

Standardvaret er at det er mikroskopisk set i forhold til fordelen ved
vedligeholdelelse af een funktion sammenlignet med x antal eens
kode-stumper.

Umiddelbart kunne jeg faktisk forestille mig at det kunne blive en *fordel*
i et fortolket sprog som PHP, da man kan lave smarte optimeringer for kode
man allerede har set, sammenlignet med kode der skal fortolkes linie for
linie. Men om det rent faktisk sker ved jeg ikke. Det er altså rent gætværk.


Er det bare et teoretisk spørgsmål eller har du en konkret situation du
sidder og prøver at optimere? :)

Evt. kan du jo prøve med og uden og se om du kan måle nogen forskel!

Sæt evt.

$starttid = gettimeofday();

i toppen af scriptet og

$sluttid = gettimeofday();

echo "<font size=1>Page generated in ";
echo
($sluttid['sec']-$starttid['sec'])*1000+($sluttid['usec']-$starttid['usec'])
/1000;
echo " ms.</font>";

i bunden af scriptet.

NB: Ovenstående målemetode giver store tilfældige udsving fra gang til gang.

--
Mvh. Mogens
www.momech.dk




Jonas Koch Bentzen (22-01-2002)
Kommentar
Fra : Jonas Koch Bentzen


Dato : 22-01-02 16:39

Mogens Meier Christensen skrev:
>
> $starttid = gettimeofday();
>
> i toppen af scriptet og
>
> $sluttid = gettimeofday();
>
> echo "<font size=1>Page generated in ";
> echo
>
($sluttid['sec']-$starttid['sec'])*1000+($sluttid['usec']-$starttid['usec'])
> /1000;
> echo " ms.</font>";
>
> i bunden af scriptet.
>
> NB: Ovenstående målemetode giver store tilfældige udsving fra gang til
> gang.

Jeps, så det er ikke en god målemetode. Det er bedre at bruge
ApacheBench og køre scriptet f.eks. 1000 gange.

--
Jonas Koch Bentzen

http://understroem.dk/

Stig Nørgaard Jepsen (22-01-2002)
Kommentar
Fra : Stig Nørgaard Jepsen


Dato : 22-01-02 17:25

> Er det bare et teoretisk spørgsmål eller har du en konkret situation du
> sidder og prøver at optimere? :)

Mest et teoretisk spørgsmål. Men mange bække små - som man siger.

Men jeg kan da hurtigt give eksempler på hvornår jeg bruger en funktion
istedet for andet kode:

Fx. istedet for at skrive:
if(isset($_POST["knap"]["kanon"])) {blabla}
så -
if(ifknap('kanon')) {blabla}

eller istedet for:

echo '<input type="Submit" name="svar" value="Ja">'
så -
svarja();

Det er bare to meget simple eksempler på hvad det er jeg gør. Nogle af
funktioner er selvfølgelig en del mere avancerede.

Jeg synes jo at det skaber et helt andet overblik, og gør nemmere at forstå
hvad det er man laver.
Men spørgsmålet er om man burde skrive koden direkte, eller om det er ligeså
hensigtsmæssigt at gøre det sådan her?


/Stig



Mogens Meier Christe~ (22-01-2002)
Kommentar
Fra : Mogens Meier Christe~


Dato : 22-01-02 17:53

>istedet for:
>
> echo '<input type="Submit" name="svar" value="Ja">'
> så -
> svarja();

I den slags tilfælde vil du *aldrig* kunne mærke forskellen
performance-mæssigt!

Hvis det var noget hvor du kaldte mikro-små funktioner hundredetusinder af
gange måske, men ikke her!

Det hele bliver spist op af WWWs langsomhed, f.eks. tager det 12 ms for mig
at connecte til min webserver på localhost (altså ikke engang over inet
eller LAN!),
(for tv2.dk tager connect 200 ms med min ADSL-linie), mens det vi taler om
du vil spare er mikroskopiske brøkdele af millisekunder per funtion!

--
Mvh. Mogens
www.momech.dk




Anders Johannsen (22-01-2002)
Kommentar
Fra : Anders Johannsen


Dato : 22-01-02 16:40

> Kan man ha' et overdrevet forbrug af funktioner, som kan koste perfomance
i
> det lange løb?

Det er forbløffende billigt at kalde funktioner. Betragt flg. kode:

<?php

require 'xlog.php';

function getTestText() {
return "Tekst";
}

xlog("Funktion start");
for ($i = 0; $i < 1000000; $i++) { $str = getTestText(); }
xlog("Funktion slut");

xlog("Inline start");
for ($i = 0; $i < 1000000; $i++) { $str = "Tekst"; }
xlog("Inline stop");

?>

Der køres to løkker en million gange. I den første kaldes en funktion, hvor
returværdien tildeles en variabel. I den anden er funktionskaldet erstattet
med en konstant tekst.

Forskellen mellem tiderne i kørslen må således afspejle det tidsmæssige
overhead ved at kalde en funktion. Eksemplet er konstrureret med henblik på
at skabe størst muligt procentvist overhead.

Resultatet af kørslen er:

## 22/01/02 15:57:07 Xlogging initiated in /home/ajoh/dev/tree/xlog.php
0.0001 Funktion start
4.7156 Funktion slut
4.7156 Inline start
7.3643 Inline stop
## 22/01/02 15:57:07 Xlog finished. Total execution time (7.3646 s.)

Del 1 kørte altså på 4.7155 sek, og del 2 på 2.6487 sek. (7.3643 - 4.7156).
Funktionskaldet repræsenterer _i dette tilfælde_ et overhead på ~80 %. Jo
mere arbejde funktionen udfører, jo lavere vil det procentvise overhead
blive.

Mere interessant er det dog, at

(4.7155 - 2.6487) / 1000000 = 0.00000020668 sek

Dvs. det tidsmæssige overhead pr. funktionskald begrænser sig til lidt over
2 milliondele af et sekund.

> Er der nogen performancemæssig straf for at bruge en funktion, istedet for
> at skrive koden direkte istedet?

Ikke i virkeligheden

/A



Niels Andersen (22-01-2002)
Kommentar
Fra : Niels Andersen


Dato : 22-01-02 18:07

"Anders Johannsen" <anders@johannsen.com> wrote in message
news:3c4d87e1$0$89082$edfadb0f@dspool01.news.tele.dk...
> Det er forbløffende billigt at kalde funktioner. Betragt flg. kode:

Din kode tager dog ikke hensyn til den tid det tager, at definere en
funktion.
Jeg tror ApacheBench-metoden vil give et bedre indtryk af forskellen.

--
Mvh.

Niels Andersen



Søg
Reklame
Statistik
Spørgsmål : 177522
Tips : 31968
Nyheder : 719565
Indlæg : 6408670
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste