crs12decoder Posted December 2, 2010 Report Posted December 2, 2010 Se stie ca max (a, = (a+b+|a-b|)/2. Modulul poate fi scris ca radical din (a- la puterea a doua.AKA max (a, = (a+b+sqrt(sqr(a-))/2.clasica functie pentru a determina maximul dintre 2 numere este:<?phpfunction oldmax($a,${ if($a>${ $max=$a; }else{ $max=$b; }return $max;}//exempluecho oldmax(2,3);?>Vreau sa stiu daca functia bazata pe calculul matematic economiseste mai multe resurse.<?phpfunction newmax($a,${$max = ($a+$b+sqrt(pow($a-$b, 2)))/2;return $max;}//exempluecho newmax(2,3);?> Quote
Xander Posted December 2, 2010 Report Posted December 2, 2010 (edited) deasta s-a inventat benchmark... apelezi ambele de 1.000.000 si vezi care merge mai repedeP.S:<?phpecho "Generez 1 mil nr random...";$a = array();$b = array();for($i=1 ; $i <= 1000000 ; $i++){ $a[$i] = mt_rand(); $b[$i] = mt_rand(); if(!($i%100000)) echo ".";}echo "\n";for($i=1;$i<=5;$i++){ $f = "mymax" . $i; echo "Testez metoda " . $i . "\n"; $start = microtime_float(); for($j=1;$j<= 1000000;$j++) $f($a[$j] ,$b[$j]); echo "Am terminat metoda " . $i . ", a durat:". (microtime_float() - $start) . "secunde\n";}function mymax1($a,${ return ($a>$ * $a + ($a<=$ * $b;}function mymax2($a,${ if($a>$ return $a; return $b;}function mymax3($a,${ return $a>$b?$a:$b;}function mymax4($a,${ return ($a+$b+sqrt(pow($a-$b, 2)))/2;}function mymax5($a,${ if($a>${ $max=$a; }else{ $max=$b; }return $max;}function microtime_float(){ list($usec, $sec) = explode(" ", microtime()); return ((float)$usec + (float)$sec);}?>Generez 1 mil nr random.............Testez metoda 1Am terminat metoda 1, a durat:0.87909197807312secundeTestez metoda 2Am terminat metoda 2, a durat:0.71782088279724secundeTestez metoda 3Am terminat metoda 3, a durat:0.76797389984131secundeTestez metoda 4Am terminat metoda 4, a durat:1.5963530540466secundeTestez metoda 5Am terminat metoda 5, a durat:0.74487495422363secundemetoda ta este cea mai lenta... cea mai rapida este metoda 2 Edited December 2, 2010 by Xander Quote
Nytro Posted December 2, 2010 Report Posted December 2, 2010 E mult mai rapida versiunea simpla, ai doar o comparatie si o atribuire, nu o gramada de calcule. In plus apelezi 2 functii, si apelurile de functii sunt consumatoare si de resurse (stiva) si de procesor (revenire din functie...). Dar asta conteaza doar daca faci milioane de apeluri ale functie pentru maxim. Quote
crs12decoder Posted December 2, 2010 Author Report Posted December 2, 2010 deasta s-a inventat benchmark... apelezi ambele de 1.000.000 si vezi care merge mai repedemetoda ta este cea mai lenta... cea mai rapida este metoda 2mersi. era o pura curiozitate am vrut sa vad daca matematica ajuta cu ceva... cat de mic doar.... la programare...... se pare ca in mod direct nu prea.Btw.. u in ce rulezi scripturile php de obicei? pe asta cel putin cand l-ai facut, l-ai rulat din browser? Quote
smagazor Posted December 3, 2010 Report Posted December 3, 2010 (edited) crs12decoderRareori iti poti forma o opinie in urma unui singur test, iar in acest caz nu ti-o poti forma. Matematica ajuta foarte mult in foarte multe cazuri pentru optimizarea programelor si implicit imbunatatirea timpului de executie. Ca exemplu, gandeste-te la urmatoarele doua cazuri foarte intalnite:1) Suma primelor n numereCa sa rezolvi aceasta problema poti aborda problema folosind un ciclu repetitiv:suma=0;for (int i=1;i<=n;i++) suma+=i;In urma acestei executii, programul executa n pasi.De asemenea, poti aborda matematic aceasta problema, realizand faptul ca aceasta suma reprezinta de fapt o progresie aritmetica cu ratia 1.suma=((1+n)*n)/n;Se executa o singura atribuire dupa cum vezi, deci e evident care e abordarea cea mai buna.2) Determinarea primalitatii unui numarPoti aborda problema folosind metoda simpla:contor=0;for (int i=1;i<=x;i++) if (x%i==0) contor++;Sau poti aborda problema folosindu-te de cunostintele matematice ce iti indica faptul ca poti parcurge un numar pana la radical din acel numar pentru a verifica daca e prim.contor=0;for (int i=2;i<=sqrt(x);i++) if (!(x%i)) contor++;Evident si in acest caz e sesizabil faptul ca a doua abordare e mult mai optima.Legat de scripturile PHP, nu le poti rula direct in browser deoarece PHP-ul nu e client side ci server side, deci codul trebuie executat pe un server.smagazor Edited December 4, 2010 by smagazor Quote
crs12decoder Posted December 3, 2010 Author Report Posted December 3, 2010 crs12decoderLegat de scripturile PHP, nu le poti rula direct in browser deoarece nu PHP-ul nu e client side ci server side, deci codul trebuie executat pe un server.smagazorAi dat un raspuns evident la o intrebare pe care nu am pus-o. Intrebarea mea era, in ce vede rezultatul programului. in browser sau intr-o fereastra de comenzi terminal/cmd sau.... altceva.Am pus intrebarea pentru ca am observat ca pentru a aduce pointerul la capat de rand foloseste "\n" nu "<br>"Sunt de acord ca matematica ajuta... dar in mod direct, nu ajuta exagerat de mult... u ai reusit sa aduci 2-3 cazuri izolate... probabil mai sunt cateva zeci... un numar destul de mic totusi Quote
egoistdream Posted December 4, 2010 Report Posted December 4, 2010 (edited) scriptul e executat pe server iar rezultat generat il vizualizezi in browserDaca vrei ca rezultatul sa fie mai evident poti lua ca timp de referinta timpul unei metode iar ca rezultat sa iti apara doar diferenta...Aici poti vizualiza rezultatul generat de script.EditCred ca lucrurile ar trebui privite din alta perspectiva...Ideea e buna...dar rezultatele nu sunt cele scontate....Daca rulezi scriptul in repetate randuri ajungi la concluzia ca timpul se modifica de fiecare data...iar de aici poti trage concluzia ca puterea de procesare nu este constanta(procesorul e ocupat si cu alte procese uneori, alteori nu)...Am mai verificat si facand diferenta dintre doua metode....teoretic diferenta trebuia sa fie constanta....rezultatul a fost:0.00065779685974 prima diferenta0.00061106681824 a 2 a0.00088691711426 a 3 a0.00335643291473 a 4 aApoi dupa ce am dat mai multe refresuri la script am observat ca uneori tipul de executie e mai mic la o metoda si mai mare la alta....As spune ca mai degraba ar trebui sa ii masori puterea de procesare de care are nevoie o functie pentru ca e ceva mai concret...timpul nu te ajuta cu nimic atunci cand puterea de procesare fluctueaza.Concluzie...perspectiva aleasa nu e cea care sa si contureze realitatea=(( Edited December 4, 2010 by egoistdream Quote