Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Alternatywna konstrukcja warunkowa.
Forum PHP.pl > Forum > PHP
starach
Witam.
Spieram się z kolegą o to który zapis metody tmpl_restore() wykona się szybciej.
Co wy o tym sądzicie. Mnie się wydaje że ten mniej czytelniejszy ( nie za bardzo wiem dlaczego, ale tak mi się wydaje)
  1. <?php
  2. public function tmpl_restore($index='')
  3. {
  4. $this->tmpl = $index=='' ? $this->tmpl_backup[count($this->tmpl_backup)] : isset($this->tmpl_backup[$index]) ? $this->tmpl_backup[$index] : die('Zly parametr. Template::tmpl_restore()');
  5. }
  6. public function tmpl_restore($index='')
  7. {
  8. if($index=='')
  9. {
  10. $this->tmpl = $this->tmpl_backup[count($this->tmpl_backup)];
  11. } else {
  12. if(isset($this->tmpl_backup[$index]))
  13. {
  14. $this->tmpl = $this->tmpl_backup[$index];
  15. } else {
  16. die('Zly parametr. Template::tmpl_restore()');
  17. }
  18. }
  19. }
  20. ?>

edit>
( nie za bardzo wiem dlaczego, ale tak mi się wydaje)
Nie potrafię tego właściwie uzasadnić.
dr_bonzo
Jak to nie potrafisz? A umieszczenie obu fragmentów kodu wewnątrz microtime() i porównanie czasów?
starach
A na czym ja to niby mam porównać ?
Na komputerze który podczas wykonywania mojego nieskończonego cmsa wyświetla mi raz czas wyższy a raz niższy zależnie od jego widzimisię ? tongue.gif
dr_bonzo
Tak. Bo nic innego ci nie pozostaje.
Zapuszczasz TE JEDNA funkcje powiedzmy 1000 razy i patrzysz na czasy smile.gif
starach
Paranoja już sam nie wiem co jest jak.
@dr_bonzo: Prosiłbym cię uprzejmie żebyś spróbował przetestować to u siebie. Jakby jeszcze ktoś mógł to zrobić to byłbym wdzięczny.
  1. <?php
  2. function getmicrotime()
  3. {
  4. list($usec, $sec) = explode("",microtime());
  5. return ((float)$usec + (float)$sec);
  6. }
  7. function test_a($obj)
  8. {
  9. $start = getmicrotime();
  10. for($i=0; $i<1000; $i++)
  11. {
  12. $obj->tmpl_restore_a();
  13. }
  14. $end = getmicrotime();
  15. $time = $end - $start;
  16. return $time;
  17. }
  18. function test_b($obj)
  19. {
  20. $start = getmicrotime();
  21. for($i=0; $i<1000; $i++)
  22. {
  23. $obj->tmpl_restore_b();
  24. }
  25. $end = getmicrotime();
  26. $time = $end - $start;
  27. return $time;
  28. }
  29. function srednia($arr)
  30. {
  31. return array_sum($arr)/count($arr);
  32. }
  33. class Test
  34. {
  35. public $tmpl;
  36. public $tmpl_backup = array('Wpis pierwszy');
  37. public function __construct(){}
  38. public function tmpl_restore_a($index='')
  39. {
  40. $this->tmpl = ($index=='' ? $this->tmpl_backup[count($this->tmpl_backup)-1] : (isset($this->tmpl_backup[$index]) ? $this->tmpl_backup[$index] : die('Zly parametr. Template::tmpl_restore()')));
  41. }
  42. public function tmpl_restore_b($index='')
  43. {
  44. if($index=='')
  45. {
  46. $this->tmpl = $this->tmpl_backup[count($this->tmpl_backup)-1];
  47. } else {
  48. if(isset($this->tmpl_backup[$index]))
  49. {
  50. $this->tmpl = $this->tmpl_backup[$index];
  51. } else {
  52. die('Zly parametr. Template::tmpl_restore()');
  53. }
  54. }
  55. }
  56. }
  57. $test = new Test;
  58. for($i=0; $i<50; $i++)
  59. {
  60. $array_a[] = test_a($test);
  61. $array_b[] = test_b($test);
  62. }
  63. $sr_a = srednia($array_a);
  64. $sr_b = srednia($array_b);
  65. ?>
  66. <table border="1">
  67. <tr>
  68. <td align="center"><b>A(<?php echo $sr_a; ?>)</b><br>B(<?php echo $sr_b; ?>)</td>
  69. <td align="center"><b>B(<?php echo $sr_b; ?>)</b><br>A(<?php echo $sr_a; ?>)</td>
  70. </tr>
  71. <tr>
  72. <td valign="top"><?php echo '<pre>'.print_r($array_a, true).'</pre>'; ?></td>
  73. <td valign="top"><?php echo '<pre>'.print_r($array_b, true).'</pre>'; ?></td>
  74. </tr>
  75. </table>
dr_bonzo
A twoje wyniki?



Kod
A(0.026080746650696)
B(0.025056304931641)



(A - B ) / A =~ 4% -> B jest szybsze o 4%
Hacker
Czasem A jest szybsze, a czasem B. Pełna losowość....
KolegS
a ja mam pytanie wstawiłem ten kod aby przetestować mój serwer zainstalowałem sobie webserv i wstawiłem ten kod odpalam a tam
Warning: explode() [function.explode]: Empty delimiter. in C:\Program Files\WebServ\httpd-users\proba\index.php on line 4
takie coś a potem jest tabelka gdzie same 0 jest wpisane
Czy coś z serwerem jest nie tak??
starach
A(0.00356226444244)
B(0.00323665142059)

A(0.0034709405899)
B(0.0031241607666)

A(0.00340549468994)
B(0.00304779052734)

Fajnie czyli coś co uznawałem za szybsze jest wolniejsze ...

Zrobiłem jeszcze testy na uproszczonych warunkach,
wyniki są podobne ...

C(0.0020939874649)
D(0.0020476102829)

C(0.00220151901245)
D(0.00203478336334)
dr_bonzo
Hacker: nie tyle losowosc co obie sa porownywalnie szybkie a zaklucenia sa wprowadzane przez inne aplikacje, system itd.

KolegS:
Cytat
a ja mam pytanie wstawiłem ten kod aby przetestować mój serwer zainstalowałem sobie webserv i wstawiłem ten kod odpalam a tam
Warning: explode() [function.explode]: Empty delimiter. in C:\Program Files\WebServ\httpd-users\proba\index.php on line 4
takie coś a potem jest tabelka gdzie same 0 jest wpisane
Czy coś z serwerem jest nie tak??

Bo tam jest blad w kodzie, zamiast "" ma byc " " w explode().


orglee:
Cytat
Fajnie czyli coś co uznawałem za szybsze jest wolniejsze ...
Dlatego sie mierzy a nie zgaduje smile.gif
Hacker
Cytat
nie tyle losowość co obie są porównywalnie szybkie a zakłócenia są wprowadzane przez inne aplikacje, system itd.


@dr_bonzo Mówiąc o pełnej losowości o to mi chodziło... Skoro zakłócenia wprowadzane przez inne aplikacje zmieniają, a wręcz odwracają wyniki to nie ma różnicy... Chyba, że w czytelności. Pod tym względem wygrywa wariant B
starach
Może w paranoje popadam ale przetestowałem jeszcze:
if(costam == 1) {
//akcja
}
if(costam == 1):
//akcja
endif;

Druga konstrukcja jest szybsza.
Nieznacznie co prawda ale szybsza.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.