Gå til innhold

PHP·pub - Programming With Attitude - and beer


Anbefalte innlegg

Videoannonse
Annonse

 

<?php

$array = array_fill(0,100000,null);
$size = sizeof($array);


for($h=0; $h < 100; $h++) {
$a = $h%2;
if($a == 0) {
	$start = microtime(true);
	// test
		for($j=0; $j < $size; $j++) {}
	// /test
	$end = microtime(true);
}
else {
	$start = microtime(true);
	// test
		foreach($array as $k => $v) {}
	// /test
	$end = microtime(true);
}
$time[$a][] = $end - $start;
}

// print
$a = 0;
echo "For: <pre>";
foreach($time[0] as $t) {
$a += $t;
echo $t."\n";
}
echo "</pre>";
$b = 0;
echo "Foreach: <pre>";
foreach($time[1] as $t) {
$b += $t;
echo $t."\n";
}
echo "</pre><pre>";
$for_a = $a / count($time[0]);
$foreach_a = $b / count($time[1]);
echo "Server software: ".$_SERVER["SERVER_SOFTWARE"]."\n";
echo "For average	: ".$for_a."\n";
echo "Foreach average: ".$foreach_a."\n";
if($for_a == $foreach_a) {
echo "Exactly the same...";
}
elseif($for_a > $foreach_a) {
echo "Foreach was ".((($for_a - $foreach_a) / $foreach_a) * 100)."% faster than for.";
}
else {
echo "For was <strong>".((($foreach_a - $for_a) / $for_a) * 100)."%</strong> faster than foreach.";
}


?>

 

Foreslår at vi kjører den koden i stedet. Da får vi kjørt flere tester (50 tester per istedet for 5). Gir noe sånt:

 

 

For:

0.0206089019775
0.0196690559387
0.0208082199097
0.020565032959
0.0204241275787
0.0216801166534
0.0219860076904
0.0204899311066
0.0331799983978
0.0225200653076
0.0308480262756
0.0245721340179
0.021824836731
0.0205109119415
0.0208761692047
0.0210359096527
0.0272700786591
0.0260200500488
0.0219039916992
0.0226609706879
0.019868850708
0.0197019577026
0.0241899490356
0.0240092277527
0.0238950252533
0.0221538543701
0.0202350616455
0.0211548805237
0.0240669250488
0.0219919681549
0.0205490589142
0.0219650268555
0.0216310024261
0.0218460559845
0.0246610641479
0.0236058235168
0.0216069221497
0.0217430591583
0.0201051235199
0.0205309391022
0.0222289562225
0.0203700065613
0.0221610069275
0.02272605896
0.0214629173279
0.0205240249634
0.0208399295807
0.0202350616455
0.0215680599213
0.0206360816956

Foreach:

0.0257270336151
0.0275919437408
0.0262660980225
0.0268340110779
0.0283861160278
0.0267481803894
0.0259809494019
0.0278301239014
0.0281488895416
0.0276911258698
0.0284330844879
0.0347740650177
0.0284740924835
0.0290570259094
0.0269339084625
0.0284860134125
0.0384240150452
0.0312159061432
0.030375957489
0.0269978046417
0.0268430709839
0.0479168891907
0.0294368267059
0.027517080307
0.0264859199524
0.0278539657593
0.0291028022766
0.0253441333771
0.0253238677979
0.0292308330536
0.0266900062561
0.0275130271912
0.026535987854
0.0293869972229
0.0275661945343
0.0273561477661
0.0264799594879
0.0268559455872
0.0269310474396
0.0295441150665
0.0266950130463
0.0264880657196
0.0281119346619
0.0275259017944
0.0265810489655
0.0331320762634
0.027186870575
0.0272109508514
0.0274260044098
0.0270500183105

Server software: Apache/2.2.3 (Ubuntu) PHP/5.2.1
For average	: 0.0222343683243
Foreach average: 0.0284339809418
For was 27.8830166303% faster than foreach.

 

Endret av MC2
Lenke til kommentar

For å være statistisk tilregnelig burde vi regne gjennomsnittet på minst 1000 kjøringer, så jeg satte grensen opp til 2500, og fikk følgende: (ikke enkeltresultater, siden det tar så stor plass).

 

Server software: Apache/2.2.4 (Win32) DAV/2 mod_ssl/2.2.4 OpenSSL/0.9.8d mod_autoindex_color PHP/5.2.1
For average    : 0.0147949551582
Foreach average: 0.0209745313644
For was 41.7681306913% faster than foreach.

Lenke til kommentar
Gjest Slettet+142

Kjørte den på denne PC-en og serveren min jeg:

 

Server software: Apache/2.2.4 (Win32) DAV/2 mod_ssl/2.2.4 OpenSSL/0.9.8e mod_autoindex_color PHP/5.2.3

For average : 0.020154633522

Foreach average: 0.0243530464172

For was 20.8310058856% faster than foreach.

Server software: Apache/2.2.3 (Ubuntu) PHP/5.2.1

For average : 0.0143566942215

Foreach average: 0.0192275238037

For was 33.9272363614% faster than foreach.

Lenke til kommentar

Hjemmemaskinen min:

2500 itereringer.

Server software: Apache/2.2.4 (Win32) PHP/5.2.4
For average    : 0.00901700782776
Foreach average: 0.0100563365936
For was 11.5263154443% faster than foreach.

 

Maskinen på jobben, der foreach tidligere var raskere:

250 itereringer.

Server software: Apache/2.2.4 (Win32) PHP/5.2.3
For average    : 0.0139458389282
Foreach average: 0.01548620224
For was 11.0453255605% faster than foreach.

 

 

Macbook

Server software: Apache/2.2.4 (Unix) PHP/5.2.1 DAV/2
For average    : 0.0224264587402
Foreach average: 0.0310993412018
For was 38.6725455053% faster than foreach.

Endret av Nazgul
Lenke til kommentar

Hjemmemaskin: (Foxconn HK, AMD64 X2 5600+, OCZ DDR2 1024MB)

Server software: Apache/2.2.4 (Win32) DAV/2 mod_ssl/2.2.4 OpenSSL/0.9.8e mod_autoindex_color PHP/5.2.3
For average	: 0.0102681779861
Foreach average: 0.0150718784332
For was 46.7824033978% faster than foreach.

 

Laptop: (Acer Ferrari)

Server software: Apache/2.2.4 (Win32) DAV/2 mod_ssl/2.2.4 OpenSSL/0.9.8e mod_autoindex_color PHP/5.2.3
For average	: 0.0223005723953
Foreach average: 0.0259665060043
For was 16.4387422171% faster than foreach.

 

Webhuset.no (Delt server)

Server software: Apache/2.0.59 (Unix) DAV/2
Uptime/load:   21:40:26 up 16 days,  6:12,  0 users,  load average: 1.52, 1.83, 1.88
For average	: 0.00670359134674
Foreach average: 0.0104811000824
For was 56.3505222838% faster than foreach.

 

Webhost1.no (Dedikert Intel Xeon 2.4GHz, 2GB RAM)

Server software: Apache/1.3.39 (Unix) PHP/5.2.4 mod_auth_passthrough/1.8 mod_log_bytes/1.2 mod_bwlimited/1.4 FrontPage/5.0.2.2635.SR1.2 mod_ssl/2.8.30 OpenSSL/0.9.7a
Uptime/load: 21:43:03 up 54 days,  2:30,  2 users,  load average: 1.85, 1.81, 1.53
For average	: 0.00671947002411
Foreach average: 0.0108291625977
For was 61.1609629748% faster than foreach.

 

Ser vist ut til at min tidligere gjetting var feil. for() er helt klart raskest, selv om det er marginalt. Men mange bekker små gjør en stor å.

Lenke til kommentar

Det slo meg plutselig at det kanskje var en ulempe at for alltid kjørte med ett tidspunkt mindre i minnet enn foreach ved hver iterering. Derfor endret jeg

if($a == 0) {

til

if($a == 1) {

for å få foreach til å kjøre før for, og nå er resultatene helt motsatt.

 

Ergo: Resultatene over er bogus. Vi må kjøre for og foreach i hver sin fil for å få riktige resultater.

Lenke til kommentar

Det overrasker meg egentlig ikke. Plassering i koden kan gi vanvittige utslag. Selv det å inkludere filene jeg pastet inn tidligere forskjellig gir en effekt. Dvs.

<?php
require('for.php');
require('foreach.php');
?>

og

<?php
require('foreach.php');
require('for.php');
?>

gir også forskjellige resultater.

 

 

 

Kjørt på laptopen:

[Ernie@jen for_foreach]$ php for_foreach.php
<pre>For:
0.18407392501831
0.19532108306885
0.18714809417725
0.18861198425293
0.18862104415894
</pre>
<pre>Foreach:
0.4731810092926
0.47581219673157
0.49096083641052
0.47632193565369
0.48439502716064
</pre>
[Ernie@jen for_foreach]$ php foreach_for.php
<pre>Foreach:
0.23840498924255
0.25164794921875
0.26544499397278
0.24612379074097
0.25488996505737
</pre>
<pre>For:
0.36389398574829
0.3875629901886
0.37805581092834
0.37649083137512
0.37795090675354
</pre>

 

 

Endret av Ernie
Lenke til kommentar
Det slo meg plutselig at det kanskje var en ulempe at for alltid kjørte med ett tidspunkt mindre i minnet enn foreach ved hver iterering. Derfor endret jeg

if($a == 0) {

til

if($a == 1) {

for å få foreach til å kjøre før for, og nå er resultatene helt motsatt.

 

Ergo: Resultatene over er bogus. Vi må kjøre for og foreach i hver sin fil for å få riktige resultater.

 

Interessant, men vil ikke si at de er bogus fordi. I de resultatene over så har 'for' kjørt før 'foreach' og det viser at 'for' gjennomsnittlig er 31.0439990268% raskere. Om vi nå kjører 'foreach' før 'for' og finner gjennomsnittlig hvor mye raskere 'foreach' er enn 'for', og det gjennomsnittet er lavere enn 31 så vil det vise at foreach er tregere, og vice versa.

 

Får skrive en bedre bench'er etter middag osv.

 

Oppgraderingen av Ubuntu går ikke som forventet, får bli en annen gang

Endret av MC2
Lenke til kommentar

Istedenfor å lage en ny tråd om dette lille spørsmålet så spør jeg heller her.

 

Hvilken kode har ? når man skal bruke preg_replace?

 

Hvis noen har en side der flere slike koder står hadde det vært konge :)

 

Edit: Jeg skal fjerne "/viktige_events/index.php?e=" fra en string.

Endret av Doffar
Lenke til kommentar

Er det mulig å få en klasse til å gi tilbake forskjellige verdier ettersom hvilken funksjon den blir kjør igjennom?

 

F.eks at "echo $MyClass;" kjører av en funksjon inne i klassen som sender ut en tekstbit. Vet at jeg kan kjøre "funksjon($MyClass->funksjon2);", men vil gjerne vite om det er mulig.

Lenke til kommentar
  • 2 uker senere...

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...