Jump to content
crs12decoder

maxmath php

Recommended Posts

Se stie ca max (a,B) = (a+b+|a-b|)/2. Modulul poate fi scris ca radical din (a-B) la puterea a doua.

AKA max (a,B) = (a+b+sqrt(sqr(a-B)))/2.

clasica functie pentru a determina maximul dintre 2 numere este:


<?php
function oldmax($a,${
if($a>${
$max=$a;
}else{
$max=$b;
}
return $max;
}

//exemplu
echo oldmax(2,3);
?>

Vreau sa stiu daca functia bazata pe calculul matematic economiseste mai multe resurse.


<?php
function newmax($a,${
$max = ($a+$b+sqrt(pow($a-$b, 2)))/2;
return $max;
}

//exemplu
echo newmax(2,3);
?>

Link to comment
Share on other sites

deasta s-a inventat benchmark... apelezi ambele de 1.000.000 si vezi care merge mai repede

P.S:



<?php
echo "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 1
Am terminat metoda 1, a durat:0.87909197807312secunde
Testez metoda 2
Am terminat metoda 2, a durat:0.71782088279724secunde
Testez metoda 3
Am terminat metoda 3, a durat:0.76797389984131secunde
Testez metoda 4
Am terminat metoda 4, a durat:1.5963530540466secunde
Testez metoda 5
Am terminat metoda 5, a durat:0.74487495422363secunde

metoda ta este cea mai lenta... cea mai rapida este metoda 2

Edited by Xander
Link to comment
Share on other sites

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.

Link to comment
Share on other sites

deasta s-a inventat benchmark... apelezi ambele de 1.000.000 si vezi care merge mai repede

metoda ta este cea mai lenta... cea mai rapida este metoda 2

mersi. 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?

Link to comment
Share on other sites

crs12decoder

Rareori 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 numere

Ca 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 numar

Poti 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 by smagazor
Link to comment
Share on other sites

crs12decoder

Legat 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.

smagazor

Ai 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

Link to comment
Share on other sites

scriptul e executat pe server iar rezultat generat il vizualizezi in browser

Daca 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.

Edit

Cred 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 diferenta

0.00061106681824 a 2 a

0.00088691711426 a 3 a

0.00335643291473 a 4 a

Apoi 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 by egoistdream
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...