infoarena

infoarena - concursuri, probleme, evaluator, articole => Informatica => Subiect creat de: Andreica din Februarie 27, 2005, 21:15:01



Titlul: Masurarea timpului
Scris de: Andreica din Februarie 27, 2005, 21:15:01
Citat
creati-va GENERATOARE de teste si VERIFICATOARE - va garantez ca este cel mai eficient asa si va ajuta mult in concursuri reale! Multi dintre noi folosim in concursuri aceasta metoda si da rezultate bune... deci, don't be lazy!  


Banuiesc ca generatoarele sunt functii random sau altele care genereaza intrari pentru a scuti efortul lucrului pe hartie dar atunci verificatoarele ce sunt??
Sunt cam confuz.


Titlul: Masurarea timpului
Scris de: Cosmin Negruseri din Februarie 27, 2005, 21:28:51
Pot sa fie programe care verifica validitatea solutiei, de exemplu daca tu trebuie sa tiparesti muchiile unui arbore, verifica daca intradevar ai tiparit un arbore, sau pot fi solutii exhaustive care merg mai greu dar dau raspuns corect, si faci comparatie intre solutia ta si solutia corecta.


Titlul: Masurarea timpului
Scris de: Patriche Daniel din Martie 03, 2005, 09:06:48
shi un timer ca sa vad cat trebuie sa optimizez sursa cum implementez? (mai ales in timpul unui concurs)


Titlul: Masurarea timpului
Scris de: Silviu-Ionut Ganceanu din Martie 03, 2005, 09:48:12
O idee foarte buna este sa programezi EXACT in mediul in care stii sigur ca se va corecta: calculator cu aceleasi performante, acelasi OS, acelasi compilator. Cum in general la concursuri se corecteaza si in Linux (la unele se corecteaza DOAR in Linux) atunci eu ti-as recomanda sa inveti (daca nu stii deja) sa codezi in acest mediu. In linux poti afla timpul de rulare al unui program foarte usor. Daca nu face figuri (daca e configurat bine) RHIDE-ul merge mult mai bine fata de Windows si mai sunt multe alte avantaje.

In concluzie:

1. In linux apelexi: time ./nume_executabil
2. In windows te joci cu functiile din "time.h". Cauta informatii despre clock() si banuiesc ca te vei prinde. Totusi, probabil ca stii, timpii din Windows sunt in general mai mari si, daca se corecteaza pe Linux, risti sa optimizezi degeaba o sursa care ia deja 100 de puncte.


Titlul: Masurarea timpului
Scris de: Valentin Stanciu din Martie 03, 2005, 12:51:58
...sau, poti sa ai o variabila long care acceseaza locatia 0:046c, acolo este locatia de memorie in care este clock-ul de la procesor, adica exact ce returneaza clock() din C.
In pascal, asta se face asa:
Cod:
var t1,t2:longint;
    t:longint absolute $0:$046c;

la inceputul programului executi t1=t, iar la sfarsit t2=t; si faci diferenta intre t2 si t1, apoi imparti diferenta la nr de tickuri pe secunda (parca 18.2, in C ai CLK_TCK).

... si am o intrebare... cum declari in C (sau C++), o variabila la o adresa de memorie specificata de tine? (adica echivalentul lui absolute din Pascal)


Titlul: Masurarea timpului
Scris de: Cristian Strat din Martie 03, 2005, 14:21:09
ca sa faceti timer-e PORTABILE aruncati o privire aici
http://info.devnet.ro/forum/viewtopic.php?t=250


Titlul: Masurarea timpului
Scris de: Dobre Catalin Andrei din Aprilie 03, 2005, 19:59:45
Am incercat in freepascal sa cronometrez timpul de executie, dar vad ca nu merge, imi da eroarea "absoulute can only be associated with a var or const". m-am uitat si in cartea lui Catalin Francu.In Tp 7 imi merge.Stiti cumva cum sa-l fac sa mearga si in fp...
Eu am facut download la Fp de pe net
((V 0.9.2)
compiler(V1.0.10)
debugger GDB(V 5.2.1))   :? .
 poate nu ii calumea asta pe care l-am luat...Are tot felul de bug-uri la debuging, nu-mi afiseaza intotdeauna calcumea vectorii...Nu-mi compileaza totdeauna codul modificat etc...
     Are cumva cineva un link de unde sa fac download si sa fie si calcumea.Nu de alta dar n-am chef sa fac download si sa aiba si ala probleme...


Titlul: Masurarea timpului
Scris de: Cosmin Negruseri din Aprilie 03, 2005, 20:19:03
Vezi ce am zis pe threadul indicat de wickedman despre masurarea timpului in free pascal.


Titlul: Răspuns: Masurarea timpului
Scris de: Moldovan Marcel din Ianuarie 28, 2010, 10:47:43
Am incercat in freepascal sa cronometrez timpul de executie, dar vad ca nu merge, imi da eroarea "absoulute can only be associated with a var or const". m-am uitat si in cartea lui Catalin Francu.In Tp 7 imi merge.Stiti cumva cum sa-l fac sa mearga si in fp...
Eu am facut download la Fp de pe net
((V 0.9.2)
compiler(V1.0.10)
debugger GDB(V 5.2.1))   :? .
 poate nu ii calumea asta pe care l-am luat...Are tot felul de bug-uri la debuging, nu-mi afiseaza intotdeauna calcumea vectorii...Nu-mi compileaza totdeauna codul modificat etc...
     Are cumva cineva un link de unde sa fac download si sa fie si calcumea.Nu de alta dar n-am chef sa fac download si sa aiba si ala probleme...
   Stiu ca nu s-a scris de mult aici, insa stie cineva sa-mi spuna cum pot sa cronometerez timpul in Free Pascal!? Am cautat si nu am gasit cum pot declara o variabila la locatia $0:$46c.  :fighting:  De fapt nu stiu daca se poate fara sa utilizez anumite functii/proceduri dintr-un anumit unit ... :'(
   In Free Pascal este destul de greu sa lucrezi intr-adevar pentru ca are multe erori :? .


Titlul: Răspuns: Masurarea timpului
Scris de: alexandru din Ianuarie 28, 2010, 11:24:19
S-a mai discutat... http://infoarena.ro/forum/index.php?topic=4315.0


Titlul: Răspuns: Masurarea timpului
Scris de: Moldovan Marcel din Ianuarie 31, 2010, 20:24:39
  Eu ma refer la situatia cand sunt in timpul unui concurs si nu gasesc un algoritm eficient pentru rezolvarea unei probleme. In acest caz voi incerca sa gasesc solutii pentru problema pana cand timpul maxim de executie admis se apropie de sfarsit, moment in care returnez cea mai buna solutie care am gasit-o pana atunci. Pentru acest caz, in Turbo Pascal utilizam:

Cod:
const maxt=0.95;
var t2:longint absolute $0000:$046c;
     t1:longint;
begin
t1:=t2;
while (t2-t1)/18.2<maxt do
  begin
  {caut solutie}
  end;
{afisez solutia cea mai buna gasita}
end.
{solutia este furnizata in maxim 0.95 secunde (timpul maxim admis)}

   Problema in Free Pascal este ca nu pot declara variabila t2 pentru ca primesc eroare la compilare. Si atunci ar trebui sa folosesc o functie sau o procedura dintr-o unitate. Folosind gettime din unitatea DOS mi se pare mai putin eficient deoarece trebuie efectuate destule calcule pentru a afla timpul trecut intre doua momente de timp. Adica in Turbo Pascal aflam numarul de tacti care daca ii impart la 18.2 obtin numarul de secunde trecute (aproximativ), dar cu procedura gettime trebuie efectuate mai multe calcule. Sau daca utilizez SysUtils :

Cod:
uses sysutils;
const maxt=990;
var start,stop:TTimeStamp;
begin
start:=DateTimeToTimeStamp(now);
repeat
// continuare cautare solutie
stop:=DateTimeToTimeStamp(now);
until stop.time-start.time>maxt;
// afisare solutia cea mai buna
end.
{solutia este furnizata in maxim 990 milisecunde (timpul maxim admis)}

pot sa fac aceasta verificare, dar nu stiu cat de rapid lucreaza functia DateTimeToTimeStamp() si, ce e cel mai important, nu stiu daca la concursuri avem voie sa utilizam astfel de unit-uri.
   Prin urmare, as vrea sa stiu care este cea mai buna metoda sa rezolv in Free Pascal o astfel de problema in timpul unui concurs!