Goededag,
Voor een project wat enigszins geoptimaliseerd moet worden ging ik op internet op zoek naar optimalisatietechnieken. Na wat dingen te hebben gelezen ging ik zelf eens wat benchmarken en ik kwam het volgende bizarre geval tegen:
for-loop 1:
for-loop2:
$a is een 1d array met 1.000.000 elementen.
Executietijd hiervan op een gewone versie van php zonder optimizers of dergelijke:
for1 : 0.00027203559875488
for2 : 1.8486249446869
En het enige significante verschil wat ik hier uit kan halen is het feit dat bij for 1 er 1e6 keer word vergeleken met een constante en bij for-2 er 1e6 keer word vergeleken met een variable.
Vertaal ik dit nu echter naar een while:
Neemt de executietijd plots toch naar 1.17 sec (for2 was 1.90 sec, dus dit is weer net iets beter).
Dit vind ik raar, ligt dit nu aan de "brakke" interpreter/parser van php die slecht optimaliseert, of is er iets wat ik over het hoofd zie waardoor de executietijden logisch te verklaren zijn?
PS: Voor de volledigheid hier de complete code met de bijbehorende uitvoer:
Voor een project wat enigszins geoptimaliseerd moet worden ging ik op internet op zoek naar optimalisatietechnieken. Na wat dingen te hebben gelezen ging ik zelf eens wat benchmarken en ik kwam het volgende bizarre geval tegen:
for-loop 1:
PHP:
1
2
3
4
5
6
7
8
| $timer->start(); //==============START TEST==================// for($i = sizeof($a); $i <= 0; $i--) { $c[$i] =& $a[$i]; } //==============STOP TEST==================// $timer->stop(); |
for-loop2:
PHP:
1
2
3
4
5
6
7
8
9
| $timer->start(); //==============START TEST==================// $size = sizeof($a); for($i = 0; $i <= $size; $i++) { $c[$i] =& $a[$i]; } //==============STOP TEST==================// $timer->stop(); |
$a is een 1d array met 1.000.000 elementen.
Executietijd hiervan op een gewone versie van php zonder optimizers of dergelijke:
for1 : 0.00027203559875488
for2 : 1.8486249446869
En het enige significante verschil wat ik hier uit kan halen is het feit dat bij for 1 er 1e6 keer word vergeleken met een constante en bij for-2 er 1e6 keer word vergeleken met een variable.
Vertaal ik dit nu echter naar een while:
PHP:
1
2
3
4
5
6
7
8
9
10
| $timer->start(); //==============START TEST==================// $i = sizeof($a); while( $i >= 0) { $c[$i] =& $a[$i]; $i--; } //==============STOP TEST==================// $timer->stop(); |
Neemt de executietijd plots toch naar 1.17 sec (for2 was 1.90 sec, dus dit is weer net iets beter).
Dit vind ik raar, ligt dit nu aan de "brakke" interpreter/parser van php die slecht optimaliseert, of is er iets wat ik over het hoofd zie waardoor de executietijden logisch te verklaren zijn?
PS: Voor de volledigheid hier de complete code met de bijbehorende uitvoer:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
| $timer = new timer(); $a = array(); $c = array(); for ($i=0; $i < 1000000; $i++) { $a[$i] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; } $timer->start(); //==============START TEST==================// for($i = sizeof($a); $i <= 0; $i--) { $c[$i] =& $a[$i]; } //==============STOP TEST==================// $timer->stop(); echo 'for1 :'.$timer->getTime().'<br />'; //============CLEAR====================/ $timer->clear(); unset($c); $c = array(); //============/CLEAR====================/ $timer->start(); //==============START TEST==================// $size = sizeof($a); for($i = 0; $i <= $size; $i++) { $c[$i] =& $a[$i]; } //==============STOP TEST==================// $timer->stop(); echo 'for2 :'.$timer->getTime().'<br />'; //============CLEAR====================/ $timer->clear(); unset($c); $c = array(); //============/CLEAR====================/ $timer->start(); //==============START TEST==================// $i = sizeof($a); while( $i >= 0) { $c[$i] =& $a[$i]; $i--; } //==============STOP TEST==================// $timer->stop(); echo 'while1 :'.$timer->getTime().'<br />'; |
code:
1
2
3
| for1 :0.00027799606323242 for2 :1.9117231369019 while1 :1.7238299846649 |