Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] Optymalizacja pętli
Forum PHP.pl > Forum > PHP
futyu
Witam, mam pętle która wymaga jakiegoś szybszego rozwiązania przy małych wartościach pętla chodzi bardzo szybko ale przy już 100 000 czas wykonania zwiększa się do 0.5-0.8s co przy dużej ilości userów zmula serwerek (kup nowy wiem tongue.gif )

Więc tak
  1. <?php
  2. ItemArray = array(999,100000,0.216000 );
  3. $Time_last = '';
  4.  
  5.  foreach($ItemArray as $a => $b)
  6.  {
  7.  settype($a, int);
  8.  settype($b['0'], int);
  9.  settype($b['1'], int);
  10.  settype($b['2'], float);
  11.  
  12.  $Type = $b['0']; 
  13.  $Count = $b['1']; 
  14.  $Time  = $b['2']; 
  15.  
  16.  while($Time_last >= $Time && $End == false)
  17.  {
  18.  if($Count > 0)
  19.  {
  20. $Time_last -= $Time;
  21.  ++$Create[$Type];
  22.  --$Count;
  23.  }
  24.  else
  25.  {
  26.  $End= true;
  27.  break;
  28.  }
  29.  }
  30.  }
  31.  }
  32.  else
  33.  {
  34.  $Create = '';
  35.  $Time_last  = 0;
  36.  }
  37. ?>
nospor
zlituj sie nad nami i wywal te wszystkie [b] z kodu i zrob to jak nalezy smile.gif
.radex
czytaj. użyj [ php ] [/ php ]

bez tych spacji oczywiście.
nospor
to moze pokolei:
1) co ta petla wogole ma robic?
2)
  1. <?php
  2. settype($b['0'], int);
  3.  settype($b['1'], int);
  4.  settype($b['2'], float);
  5. ?>

yyy, a to czemu mialo sluzyc? PRzecuez $b to liczba a nie tablica.
futyu
Cytat(nospor @ 20.06.2008, 15:20:27 ) *
to moze pokolei:
1) co ta petla wogole ma robic?
2)
  1. <?php
  2. settype($b['0'], int);
  3.  settype($b['1'], int);
  4.  settype($b['2'], float);
  5. ?>

yyy, a to czemu mialo sluzyc? PRzecuez $b to liczba a nie tablica.


1. Ma stworzyć przez określony czas(3 element tablicy) ileś obiektów aż się skończy ten czas.
2. ustawia typ danych normalnie masz string a to zmieni na int szybciej działa w ten sposób
nospor
ad2) przeciez $b to liczba. raz 999, raz 10000 i tak co obrot petli inna liczba. A ty na tej liczbie robisz jakies rzutowania jak na tablicy
.radex
koledze się chyba $b pomyliło z $ItemArray tongue.gif
futyu
dobra zamieszczam wersje taką którą sobie można sprawdzić tongue.gif i powinno być juz wszystko jasne. Oczywiście jest to część funkcji bardziej złożonej tutaj są dane już wstawione a nie pobierane ale ta pętla najbardziej zwalnia.

  1. <?php
  2.  function gen_time()
  3. {
  4. list($usec, $sec) = explode(' ', microtime());
  5. return ((float)$usec + (float)$sec);
  6. }
  7.  
  8. //start generacji czasu
  9. $start = gen_time();
  10.  
  11.  
  12. //typy itemów i ich ilość
  13. $Items = "111,100000;112,1000;203,50000;113,1000;";
  14.  
  15. $time_item = 6666611111;
  16. $left_time = 10;
  17.  
  18. if($Items != 0 && $left_time != 0)
  19. {
  20. $time_item += $left_time;
  21. $id = explode(';',$Items);
  22.  
  23. foreach($id as $n => $array)
  24. {
  25. if(false == empty($array))
  26. {
  27. //rozbij tablice
  28. $array  = explode(',',$array);
  29. $CArray[$n] = array($array['0'],$array['1'],100);
  30. }
  31. }
  32. $Items = '';
  33. $end  = false;
  34. $create = '';
  35. foreach($CArray as $a => $b)
  36. {
  37. //ustaw danym typy
  38. settype($a, int);
  39. settype($b['0'], int);
  40. settype($b['1'], int);
  41. settype($b['2'], float);
  42.  
  43. $Type = $b['0']; 
  44. $Count  = $b['1']; 
  45. $Time = $b['2']; 
  46.  
  47. //wykonuj puki nie dojdzie do 0 lub nie skończy się czas 
  48. while($time_item >= $Time && $end == false)
  49. {
  50. //sprawdzaj czy jest jeszcze coś do dodanie jeżeli nie przerwij pętle
  51. if($Count > 0)
  52. {
  53. $time_item -= $Time;
  54. ++$create[$Type];
  55. --$Count;
  56. }
  57. else
  58. {
  59. $end = true;
  60. break;
  61. }
  62. }
  63. if($Count != 0)
  64. {
  65. $Items .= $Type.",".$Count.";";
  66. }
  67. }
  68. }
  69. else
  70. {
  71. $create = '';
  72. $time_item = 0;
  73. }
  74.  
  75. $end = gen_time();
  76.  
  77. //czas wykonania skryptu
  78. echo round($end - $start,3);
  79.  
  80. ?>
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.