/ 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
sprintf vs. str_replace ?
Fra : Ulrik Nielsen


Dato : 01-03-04 10:33


Hej der,


Er der nogen der har en mening om sub?
- er det hurtigere/bedere at bruge sprintf eller str_replace på enkelte
"replaces" ?

ex:
$tst = "dette er %s test";
echo str_replace('%s', 'en', $tst);
echo sprintf($tst,'en');

anyone ?

--
>> ulrik nielsen
excuse of the day : Cosmic ray particles crashed through the hard disk
: platter
from bofh : http://www.cs.wisc.edu/~ballard/bofh/

 
 
Kim Emax (01-03-2004)
Kommentar
Fra : Kim Emax


Dato : 01-03-04 17:31

"Ulrik Nielsen" <un.spam@tiscali.dk> wrote

> Er der nogen der har en mening om sub?
> - er det hurtigere/bedere at bruge sprintf eller str_replace på enkelte
> "replaces" ?
>
> ex:
> $tst = "dette er %s test";
> echo str_replace('%s', 'en', $tst);
> echo sprintf($tst,'en');
>
> anyone ?

har du prøvet at lave en løkke, der kører eks. 10.000 gange og måle
forskellen?

--
Take Care
Kim Emax - master|minds - Vi tænker IT for dig...
http://www.masterminds.dk - http://www.emax.dk



Thomas Lindgaard (01-03-2004)
Kommentar
Fra : Thomas Lindgaard


Dato : 01-03-04 21:28

On Mon, 01 Mar 2004 17:31:18 +0100, Kim Emax wrote:

> har du prøvet at lave en løkke, der kører eks. 10.000 gange og måle
> forskellen?

Det prøvede jeg lige...

<?php

function runtime($start, $end)
{
return ($end['sec'] - $start['sec']) * 1000 +
($end['usec'] - $start['usec']) / 1000;
}

$num_tests = 40;

print "+---------------------------+-------------+-------------+\n";
print "| iterationer | sprintf | str_replace | forskel |\n";
print "+---------------------------+-------------+-------------+\n";

for ($j = 0; $j < $num_tests; $j++)
{
$iterations = 500 * $j + 500;

$start = gettimeofday();
for ($i = 0; $i < $iterations; $i++)
{
sprintf('dette er test nummer %d', $i);
}
$end = gettimeofday();
$sprintf[$j] = runtime($start, $end);

$start = gettimeofday();
for ($i = 0; $i < $iterations; $i++)
{
str_replace('%d', $i, 'dette er test nummer %d');
}
$end = gettimeofday();
$str_replace[$j] = runtime($start, $end);
printf("| %11d | %4.6f | %4.6f | %4.6f |\n",
$iterations, $sprintf[$j], $str_replace[$j],
($sprintf[$j] - $str_replace[$j]) / $iterations);
}

print "+---------------------------+-------------+-------------+\n";

?>

giver følgende output:

+---------------------------+-------------+-------------+
| iterationer | sprintf | str_replace | forskel |
+---------------------------+-------------+-------------+
| 500 | 1.806000 | 2.501000 | -0.001390 |
| 1000 | 3.708000 | 5.223000 | -0.001515 |
| 1500 | 6.954000 | 109.162000 | -0.068139 |
| 2000 | 8.011000 | 113.700000 | -0.052845 |
| 2500 | 9.286000 | 120.874000 | -0.044635 |
| 3000 | 11.451000 | 118.955000 | -0.035835 |
| 3500 | 114.921000 | 17.445000 | 0.027850 |
| 4000 | 14.758000 | 124.073000 | -0.027329 |
| 4500 | 17.006000 | 133.816000 | -0.025958 |
| 5000 | 121.258000 | 25.314000 | 0.019189 |
| 5500 | 123.077000 | 28.382000 | 0.017217 |
| 6000 | 128.427000 | 31.945000 | 0.016080 |
| 6500 | 128.141000 | 33.090000 | 0.014623 |
| 7000 | 127.188000 | 36.156000 | 0.013005 |
| 7500 | 131.950000 | 42.077000 | 0.011983 |
| 8000 | 134.888000 | 40.902000 | 0.011748 |
| 8500 | 132.755000 | 43.936000 | 0.010449 |
| 9000 | 141.815000 | 46.257000 | 0.010618 |
| 9500 | 139.498000 | 49.172000 | 0.009508 |
| 10000 | 138.210000 | 52.144000 | 0.008607 |
| 10500 | 150.028000 | 53.236000 | 0.009218 |
| 11000 | 143.869000 | 55.284000 | 0.008053 |
| 11500 | 150.230000 | 60.148000 | 0.007833 |
| 12000 | 147.816000 | 60.953000 | 0.007239 |
| 12500 | 150.290000 | 68.492000 | 0.006544 |
| 13000 | 153.401000 | 67.042000 | 0.006643 |
| 13500 | 153.732000 | 68.528000 | 0.006311 |
| 14000 | 161.347000 | 71.921000 | 0.006388 |
| 14500 | 157.630000 | 72.791000 | 0.005851 |
| 15000 | 165.963000 | 80.022000 | 0.005729 |
| 15500 | 166.345000 | 79.319000 | 0.005615 |
| 16000 | 170.510000 | 81.994000 | 0.005532 |
| 16500 | 167.122000 | 84.739000 | 0.004993 |
| 17000 | 175.313000 | 86.959000 | 0.005197 |
| 17500 | 171.243000 | 92.090000 | 0.004523 |
| 18000 | 177.703000 | 94.018000 | 0.004649 |
| 18500 | 174.480000 | 95.276000 | 0.004281 |
| 19000 | 184.833000 | 96.902000 | 0.004628 |
| 19500 | 178.659000 | 102.867000 | 0.003887 |
| 20000 | 183.906000 | 101.837000 | 0.004103 |
+---------------------------+-------------+-------------+

str_replace er faktisk en lille smule hurtigere en sprintf (det overrasker
mig) - undtagen lige omkring 1500-4500 iterationer... og det er ikke bare
denne kørsel der udviser den opførsel, idet der altid er nogle af de
små målinger der er meget langsommere for str_replace'es vedkommende.

Mvh.
/Thomas

Ulrik Nielsen (01-03-2004)
Kommentar
Fra : Ulrik Nielsen


Dato : 01-03-04 21:42

Thomas Lindgaard wrote:
> On Mon, 01 Mar 2004 17:31:18 +0100, Kim Emax wrote:
>
> Det prøvede jeg lige...
>
> str_replace er faktisk en lille smule hurtigere en sprintf (det overrasker
> mig) - undtagen lige omkring 1500-4500 iterationer... og det er ikke bare
> denne kørsel der udviser den opførsel, idet der altid er nogle af de
> små målinger der er meget langsommere for str_replace'es vedkommende.

cool test.. :)

jeg tror nu også kun at str_replace er hurtig på denne slags replaces...

hvis man udvider strengen til at skulle skifte mere end et "felt" ud, ja
så tror jeg nu at sprintf vinder igen, for ikke at sige, den er mere
velegnet til det ;)

- så er det jo bare om man skal bruge tiden på at optimere her hvor man
(måske) kan spare 0.001390 sec på 500 replaces...

--
>> ulrik nielsen
excuse of the day : IRQ-problems with the
: Un-Interruptible-Power-Supply
from bofh : http://www.cs.wisc.edu/~ballard/bofh/

Thomas Lindgaard (01-03-2004)
Kommentar
Fra : Thomas Lindgaard


Dato : 01-03-04 22:40

On Mon, 01 Mar 2004 21:42:22 +0100, Ulrik Nielsen wrote:

> - så er det jo bare om man skal bruge tiden på at optimere her hvor man
> (måske) kan spare 0.001390 sec på 500 replaces...

Lidt har jo også ret! - men ja, sprintf() vil nok være mit foretrukne
valg.

Mvh.
/Thomas

Ulrik Nielsen (01-03-2004)
Kommentar
Fra : Ulrik Nielsen


Dato : 01-03-04 22:54

Thomas Lindgaard wrote:
> On Mon, 01 Mar 2004 21:42:22 +0100, Ulrik Nielsen wrote:
>
>>- så er det jo bare om man skal bruge tiden på at optimere her hvor man
>>(måske) kan spare 0.001390 sec på 500 replaces...
>
> Lidt har jo også ret! - men ja, sprintf() vil nok være mit foretrukne
> valg.

jeg er enig, men jeg tror måske at man kunne finde andre steder i ens
kode der kunne trænge til en kærlig hånd _før_ man starter med denne ;)

--
>> ulrik nielsen
excuse of the day : Sysadmin accidentally destroyed pager with a large
: hammer.
from bofh : http://www.cs.wisc.edu/~ballard/bofh/

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

Månedens bedste
Årets bedste
Sidste års bedste