Kompletnie mylisz pojęcia "dobrego i złego programisty". Dobry, to niekoniecznie taki, który potrafi napisać coś sam, ale taki, który ma na tyle szeroką wiedzę, że nie będzie wymyślać koła od nowa, ale także skorzystać potrafi z poprawnego kodu już istniejącego. Poza tym zadam Ci pytanie... Jeśli jakaś funkcja weszła jako wbudowana do języka to będzie ona wydajniejsza czy nie od samodzielnie napisanej? Zwróć uwagę, że Ty w tej jednej używasz 3 pętli i 6 razy wbudowanej date() okraszonych masą działań matematycznych, także w pętlach. Co będzie wydajniejsze? Dodam, że z Twojej strony kompletnie olewasz walidację, nie zwracasz uwagi na daty wcześniejsze niż rok 2000 i wiele dupereli. Uważasz, że masz szybszą? Zrobiłem test prosty... 100000 wywołań mojej i Twojej. Tu masz kod by to sobie przetestować:
<?php
function diff( $data, $data2, $type = 's') {
throw new Exception('Data początkowa nie jest prawidłowa!');
throw new Exception('Data końcowa nie jest prawidłowa!');
} else {
$sekund = abs( $start-$end ); switch( $type ) {
case 'w': //weeks
return $sekund/604800;
case 'd': //days
return $sekund/86400;
case 'h': //hours
return $sekund/3600;
case 'm': //minutes
return $sekund/60;
case 's': //seconds
default:
return $sekund;
}
}
}
function roznicaCzasow($r,$m,$d,$h,$i,$s,$R,$M,$D,$H,$I,$S){
$dni[0]=$dni[12]=31; $dni[1]=28; $dni[2]=31; $dni[3]=30; $dni[4]=31; $dni[5]=30; $dni[6]=31; $dni[7]=31; $dni[8]=30; $dni[9]=31; $dni[10]=30; $dni[11]=31;
$roznica=0;
if($R<$r || ($R==$r && $M<$m) || ($R==$r && $M==$m && $D<$d))return "Błąd: próba podróży w czasie niemożliwa!";
if(!przestepny($R) && $M==1 && $D==29)return "Bł?d: docelowa data nie istnieje!";
if($r<$R){
$_s=$_i=$_h=$ileDniMinelo=0;
$_d=$_m=1;
while($_m<$m){
$ileDniMinelo+=60*60*24*$dni[++$_m-(!(przestepny($r) && $_m==2))];
}
$ileDniMinelo+=60*60*24*($d-$_d);
$ileDniMinelo+=60*60*($h-$_h);
$ileDniMinelo+=60*($i-$_i);
$ileDniMinelo+=$s-$_s;
$s=$i=$h=0;
$d=$m=1;
$roznica+=(365+przestepny(++$r-1))*24*60*60-$ileDniMinelo;
}
while($r<$R){
$roznica+=(365+przestepny(++$r-1))*24*60*60;
}
while($m<$M){
$roznica+=60*60*24*$dni[++$m-(!(przestepny($r) && $m==2))];
}
$roznica+=60*60*24*($D-$d);
$roznica+=60*60*($H-$h);
$roznica+=60*($I-$i);
$roznica+=$S-$s;
return $roznica;
}
function przestepny($rok){
return (!$rok%4 && !(!$rok%100 && $rok%400))?1:0;
}
for($i = 0; $i<100000; $i++) {
try {
diff
('2010-10-10 10:10:10', date('Y-m-d H:i:s'), 'd'); } catch (Exception $e) {
}
}
for($j = 0; $j<100000; $j++) {
$r=10;
$m=10;
$d=10;
$h=10;
$i=10;
$s=10;
roznicaCzasow($r,$m,$d,$h,$i,$s,$R,$M,$D,$H,$I,$S);
}
echo 'thek: '.($stop1-$start1).'<br />benio: '.($stop2-$start2); ?>
Cytat
thek: 5.2500369548798
benio: 9.1759741306305
Nadal uważasz, że Twoja jest szybsza? Jak dla mnie 2-krotnie wolniejsza. Dlatego zanim zaczniesz uważać, że masz lepszy "skill" po potrafisz napisać sam - przetestuj się i swoje funkcje a potem porównaj przejrzystość kodu... Moje 22 krótkie i bardzo czytelne oraz schludne linijki kodu czy 35 Twojego "nie wiem co się dzieje"?
Dodajmy, że Twój "skill" nie pozwolił Ci zauważyć, iż nie masz nawet swojego skryptu choć pobieżnie optymalizowanego pod katem przejrzystości i poprawności.
$dni[0]=$dni[12]=31; $dni[1]=28; $dni[2]=31; $dni[3]=30; $dni[4]=31; $dni[5]=30; $dni[6]=31; $dni[7]=31; $dni[8]=30; $dni[9]=31; $dni[10]=30; $dni[11]=31;
a
$dni[0]=$dni[2]=$dni[4]=$dni[6]=$dni[7]=$dni[9]=$dni[11]=31; $dni[1]=28; $dni[3]=$dni[5]=$dni[8]=$dni[10]=30;
krócej i bez błędu. Nie zauważyłeś, że nie ma miesiąca po grudniu -> $dni[12]
Do tego data musi być podana w formacie 'yymmddhhiiss' co jest kompletnie nieprzejrzyste, że o poprawieniu po Tobie błędów typu Notice nie wspomnę. I tak poszedłem na rękę bo nie walnąłem w wywołaniu tak jak sobie życzyłeś:
$datanapisaniapostu = '101010101010';
$r=$datanapisaniapostu[0].$datanapisaniapostu[1];
$m=$datanapisaniapostu[2].$datanapisaniapostu[3];
$d=$datanapisaniapostu[4].$datanapisaniapostu[5];
$h=$datanapisaniapostu[6].$datanapisaniapostu[7];
$i=$datanapisaniapostu[8].$datanapisaniapostu[9];
$s=$datanapisaniapostu[10].$datanapisaniapostu[11];
ale już kulturalnie podałem policzone wartości jako 10 typu int, a więc bez dodatkowej konwersji typów. I tak kod poległ wolniejszy. Nadal masz wątpliwości czy test przeprowadzisz tym razem bez tekstów: "Wasze propozycje są również dobre, choć o bardziej czasochłonne." i PO testach czasowych. To, że ja wolę wykorzystać sprawdzone metody, zamiast po raz 1000 wymyślać koło na nowo nie świadczy o mojej ułomności, ale fakcie, że jestem inteligentny na tyle, by tego
nie robić. Znam model matematyczny obliczania dni i co z tego? To koniecznie powód, by z niego korzystać? Zrobię to wtedy, gdy PHP nie udostępni mi gotowego lub zaproponowany przez język sposób/funkcja nie będą odpowiednio wydajne dla moich potrzeb.
To co zrobiłeś to "sztuka dla sztuki" i każdy przeglądający Twój kod będzie się zastanawiał CO Ty właściwie zrobiłeś. Mój czyta się po prostu wygodnie. Jest przejrzysty niemal do bólu. Jedyny zgryz może mieć człowiek gdy natknie się na abs. A zastosowałem to tylko po to, by można było stosować daty zamiennie. Twój kod wysypie wtedy tekstem o "podróży w czasie". Tak więc kolejny "minus" na konto Twojej funkcji. Jedyną osoą w temacie, która uważa że robi coś lepiej jesteś Ty. Nie mając bowiem nawet kodu z naszej strony
założyłeś, że i tak Twój sposób jest lepszy. Do tego oczywiście nie wiesz chyba, że obliczenia silnika bazy danych są wielokrotnie szybsze niż obliczenia php jako języka interpretowanego. Nawet kilkunastokrotnie. No ale lepiej sypnąć, że się jest mastahem, kompletnie olewając testy jakiekolwiek. Ja Ci
tylko zrobiłem test po stronie php. Gdybym miał zrobić test kodu php z zapytaniem sql, to byś się pogrążył. A czemu? Bo byś miał taki ciąg u siebie:
a) pobierz rekordy
b) policz czy można je wyświetlić (wolniejsze niż sprawdzenie w bazie)
c) wyświetl możliwe
versus
a) pobierz rekordy pasujące (tu są obliczenia wiele razy szybsze, bo na poziomie silnika, a nie interpretera języka)
b) wyświetl je
Dalej mam Ci wyjaśniać różnice czy już wystarczająco mocno pokazałem, że co jak co, ale zaledwie musnąłeś problem, który vokiel czy ja rozwiązaliśmy obszerniej, a na dodatek bez tekstów "mój kod lepszy i koniec"?
PS: z parkowaniem mnie rozwaliłeś :D Właśnie akurat teraz zdaję kurs prawa jazdy i wiesz co? Instruktor na kursie gdy widział jak parkuję stwierdził, że "gdyby kursanci robili to tak bezproblemowo jak Ty, to nie musiałbym parkowania uczyć". Dodam, że powiedział to gdy
pierwszy raz miałem równoległe, czyli popularna "kopertę". Czyli jestem zajebistym kierowcą? Akurat tego bym nie twierdził, bo już po chwili przejeżdżałem na 4 biegu przez skrzyżowanie na pomarańczowym, a na następnej godzinie wchodziłem poślizgiem w zakręt 90 stopni mając 50 na liczniku i nogę na gazie, co on prawie palpitacjami przypłacił.