•LtRaven
Strain
Karma: 1
Deconectat
Mesaje: 2
|
 |
« : Martie 18, 2005, 23:25:53 » |
|
Cum folosesc random() in devc ?
|
|
|
Memorat
|
|
|
|
•greco
|
 |
« Răspunde #1 : Martie 18, 2005, 23:31:29 » |
|
#include <stdio.h> #include <stdlib.h> #include <time.h>
int main () { srand ((unsigned) time (0)); printf ("%d\n", rand () % 10000); return 0; }
Asa faci un numar aleator in orice compilator compatibil cu standardele (sper). stdlib.h il folosesti pt. srand si rand, time.h pentru a seta generatorul intr-un punct. Or fi si alte metode, eu asta am folosit-o si ar trebui sa mearga cam peste tot.
|
|
|
Memorat
|
Jump in the cockpit and start up the engines Remove all the wheelblocks there's no time to waste Gathering speed as we head down the runway Gotta get airborne before it's too late.
|
|
|
•teplesnescdenutevezi
Strain
Karma: 0
Deconectat
Mesaje: 18
|
 |
« Răspunde #2 : Martie 20, 2005, 13:51:10 » |
|
cum masor timpul care s-a scurs de la inceputul rularii ? am observat ca la djgpp nu exista in time.h functia CLK_TCK.
|
|
|
Memorat
|
|
|
|
•wickedman
|
 |
« Răspunde #3 : Martie 20, 2005, 13:52:31 » |
|
acum se cheama CLOCKS_PER_SEC
|
|
|
Memorat
|
|
|
|
•teplesnescdenutevezi
Strain
Karma: 0
Deconectat
Mesaje: 18
|
 |
« Răspunde #4 : Martie 20, 2005, 13:53:48 » |
|
multumesc.
|
|
|
Memorat
|
|
|
|
•druid
Strain
Karma: 1
Deconectat
Mesaje: 27
|
 |
« Răspunde #5 : Martie 20, 2005, 15:34:24 » |
|
CLK_TCK nu e funcite, e un #define 
|
|
|
Memorat
|
|
|
|
•teplesnescdenutevezi
Strain
Karma: 0
Deconectat
Mesaje: 18
|
 |
« Răspunde #6 : Martie 20, 2005, 16:45:30 » |
|
bine ca esti tu destept.
|
|
|
Memorat
|
|
|
|
•druid
Strain
Karma: 1
Deconectat
Mesaje: 27
|
 |
« Răspunde #7 : Martie 20, 2005, 22:09:35 » |
|
bine ca esti tu destept. 
|
|
|
Memorat
|
|
|
|
•teplesnescdenutevezi
Strain
Karma: 0
Deconectat
Mesaje: 18
|
 |
« Răspunde #8 : Martie 23, 2005, 12:05:26 » |
|
imi spune si mie cineva ce trebuie sa includ ca sa folosesc memset pe compilatorul de c++ de pe info arena ?
|
|
|
Memorat
|
|
|
|
•greco
|
 |
« Răspunde #9 : Martie 23, 2005, 13:47:14 » |
|
cstring probabil
|
|
|
Memorat
|
Jump in the cockpit and start up the engines Remove all the wheelblocks there's no time to waste Gathering speed as we head down the runway Gotta get airborne before it's too late.
|
|
|
•svalentin
|
 |
« Răspunde #10 : Martie 23, 2005, 16:13:11 » |
|
string.h
|
|
|
Memorat
|
|
|
|
•Matrix
Strain
Karma: -3
Deconectat
Mesaje: 41
|
 |
« Răspunde #11 : Martie 23, 2005, 23:12:10 » |
|
decat sa folosesti memset mai bine faci cu un " for " sau mai bine declari un nou sir pt ca e mult mai rapid 
|
|
|
Memorat
|
|
|
|
•cavendish
Strain
Karma: 2
Deconectat
Mesaje: 43
|
 |
« Răspunde #12 : Martie 23, 2005, 23:19:41 » |
|
decat sa folosesti memset mai bine faci cu un " for " sau mai bine declari un nou sir pt ca e mult mai rapid  nu. mai bine folosesti memset sau memcpy
|
|
|
Memorat
|
|
|
|
•Matrix
Strain
Karma: -3
Deconectat
Mesaje: 41
|
 |
« Răspunde #13 : Martie 23, 2005, 23:24:53 » |
|
de ce sa setezi un sir de 100 000 de elemente pe 0 cu memset ?? cand poti sa declari unul nou, e o operatie care costa mult timp
|
|
|
Memorat
|
|
|
|
•cavendish
Strain
Karma: 2
Deconectat
Mesaje: 43
|
 |
« Răspunde #14 : Martie 23, 2005, 23:40:30 » |
|
fiindca declarand un sir nou de 100 000 de car pe stiva, aloci 97KB care nu sunt neaparat initializati cu 0. Doar variabilele globale is initializate cu 0(NULL). Si daca trebe sa faci de 1000 de ori setarea pe 0 a unui sir, nu are rost sa faci o variabila globala de 1000x100.000
|
|
|
Memorat
|
|
|
|
•Matrix
Strain
Karma: -3
Deconectat
Mesaje: 41
|
 |
« Răspunde #15 : Martie 23, 2005, 23:43:02 » |
|
daca ai de gand sa setezi de 1000 de ori un sir de 100 000 elemente, atunci mai bine te gandesti la alta rezolvare
|
|
|
Memorat
|
|
|
|
•cavendish
Strain
Karma: 2
Deconectat
Mesaje: 43
|
 |
« Răspunde #16 : Martie 24, 2005, 01:17:28 » |
|
fiindca deja m-am plictisit, incearca asta: long i,t1,t2; t1 = clock(); for(i=10000; i>0; --i) memset(buffer,0,sizeof(buffer)); t2 = clock(); printf("memset: %ld -> %ld = %ld\n",t1,t2,t2-t1);
si long i,j,t1,t2; t1 = clock(); for(i=10000; i>0; --i) for(j=sizeof(buffer)-1; j>=0; --j) buffer[j]=0; t2 = clock(); printf("for: %ld -> %ld = %ld\n",t1,t2,t2-t1);
si o sa vezi ca obtii un raport 1 : 5 al timpilor. Si uite ca intra intr-o secunda cu 10.000 de setari!
|
|
|
Memorat
|
|
|
|
•Matrix
Strain
Karma: -3
Deconectat
Mesaje: 41
|
 |
« Răspunde #17 : Martie 24, 2005, 01:45:14 » |
|
bullshit
|
|
|
Memorat
|
|
|
|
•rgrig
|
 |
« Răspunde #18 : Martie 24, 2005, 07:24:21 » |
|
Am incercat codul de mai sus cu limite ceva mai mari (repeta de 1e+5 ori si buffer de 1e+4 bytes). Varianta cu memset merge intr-adevar mult mai repede. Codul care face initializarea buffer-ului in cazul variantei cu for este: .L10: xorl %ecx, %ecx movb %cl, -10008(%eax,%ebp) decl %eax jns .L10
Sincer nu inteleg de ce tot reseteaza valoarea lui ecx (e compilat cu optimizari). Codul corespunzator in varianta memset este: .L6: movl %ebx, %edi movl %edx, %ecx movl %esi, %eax rep stosl decl -10028(%ebp) jns .L6
Si, ca sa citez din manualul intel ( http://ftp://download.intel.com/design/pentium/manuals/24143004.pdf): A REP STOS instruction is the fastest way to initialize a large block of memory. In plus pentru codul cu memset compilatorul s-a prins ca trebuie sa faca initializarea o singura data (desi nu s-a prins ca nu trebuie sa initializeze contorul buclei exterioare!). Asa incat benchmark-ul timpilor nu prea e corect asa cum apare in codul din mesajul de mai sus. In orice caz, daca Intel zice ca asta e cea mai rapida varianta n-are rost si nici n-am timp  sa nu-i cred. Pana una alta eu personal nu prea sunt fan memset din simplul motiv ca e doar un factor constant de diferenta de viteza. In plus nici n-am nevoie prea des de initializari din astea. De obicei zic:
|
|
|
Memorat
|
|
|
|
•cavendish
Strain
Karma: 2
Deconectat
Mesaje: 43
|
 |
« Răspunde #19 : Martie 24, 2005, 22:49:43 » |
|
In plus pentru codul cu memset compilatorul s-a prins ca trebuie sa faca initializarea o singura data (desi nu s-a prins ca nu trebuie sa initializeze contorul buclei exterioare!). Asa incat benchmark-ul timpilor nu prea e corect asa cum apare in codul din mesajul de mai sus. memset() e o functie definita din punctul meu de vedere [DevCpp & g++] in <string.h>. Nu are statut special, adica nu e keyword. Acum, sa recapitulam ce spui: compilatorul ruleaza o data functia la inceput si apoi face doar incrementari/comparari de index. NU. Daca nu ma crezi incearca codul de mai jos: #include <stdio.h> void foo() { printf("foo\n"); } int main(void) { for(long i=10000; i>0; --i) foo(); return 0; }
Si numara de cate ori vezi "foo". Apoi ai putea zice ca memset are statut special si ca exista optimizarea exact pt chestia asta: un for in care tot ce faci e sa setezi un sir. Dar nu e cazul, nu din momentul in care a luat 1 sec (1078 ticks)* pentru un for de la 10.000 la 1. Daca rulai codul realizai asta. Dar se pare ca ai un fel de compilator mintal care face optimizari inexistente. [edit pt Matrix:] * - timpul de la programul cu memset; la programul cu foo nu calculez timpi.
|
|
|
Memorat
|
|
|
|
•Matrix
Strain
Karma: -3
Deconectat
Mesaje: 41
|
 |
« Răspunde #20 : Martie 24, 2005, 22:57:49 » |
|
afisarea pe ecran e foarte costisitoare din punct de vedere al timpului, incearca sa afisezi mai bine intr-un fisier, si ar mai fi si apelul de functie, care de asemenea dureaza timp, putin , dar suficient ..
|
|
|
Memorat
|
|
|
|
•rgrig
|
 |
« Răspunde #21 : Martie 26, 2005, 13:54:11 » |
|
M-am uitat un pic mai atent la rezultatul compilarii: intr-adevar cele doua bucle raman, compilatorul nu-si da seama ca poate scapa de cea exteriara. Se vad amandoua in codul pe care l-am postat mai sus.
Cat despre memset functie normala... Eu am spus ce face gcc 3.3.5 nu ce spune standardul. Si gcc face inline pentru memset chiar si la -O2, cand majoritatea functiilor, de exemplu printf, nu beneficiaza de acest tratament. Dupa ce face inline ajunge la codul de mai sus in care nu mi se pare deloc SF sa-si dea seama ca nu e nevoie de bucla exterioara.
Rulasem programul, doar ca pe calculatorul meu a durat sub 0.01s asa incat putea fi si zgomot de masurare (am masurat cu "time" nu cu clock() -- in felul asta codul in asamblor a ramas mai simplu).
Asa, sa revenim. Mai sunt inca cel putin doua motive (strans legate) pentru care varianta cu memset merge mai repede. Codul generat seteaza cuvinte, nu octeti. Ca urmare (1) sunt de patru ori mai putine scrieri in memorie si (2) toate adresarile sunt aliniate. Pe de alta parte, din cauza penuriei de registre de uz general pe x86 si pentru ca rep/stos iau parametrii in vreo 3 registre compilatorul nu mai are unde sa inghesuie si contorul buclei exterioare asa incat il lasa pe stiva. Accesele fiind f. localizate se foloseste practic sigur cache-ul intern.
|
|
|
Memorat
|
|
|
|
•wickedman
|
 |
« Răspunde #22 : Martie 26, 2005, 14:52:42 » |
|
o implementare pentru memsetbottom line: e mai simplu sa folosesti memset fara for-uri, variabile in plus bla bla e cel putin la fel de rapid ca e inline. studiati codul sursa sa vedeti daca o simpla bucla e la fel de eficienta. PS: am vazut si implementari mult mai simple (o bucla) pentru memset. nu stiu ce compilator era dar mi se pare stupid sa mai insiste cineva pe ideea ca e mai bine sa faci tu de mana ta o bucla. avand in vedere ca merge cel putin la fel de repede, putem spera ca pe anumite compilatoare / SO va merge mai repede.
|
|
|
Memorat
|
|
|
|
•Dark_Raxvan
Strain
Karma: -14
Deconectat
Mesaje: 13
|
 |
« Răspunde #23 : Mai 11, 2005, 15:24:14 » |
|
Lucrez cu coduri de grafica avansata sub dos adik ceva in genul direct 3d si nu pot sa folosesc numai borlandc. As dori sa folosesc Djgpp dar nu pot HELLP!!!!!!!!!
|
|
|
Memorat
|
|
|
|
•svalentin
|
 |
« Răspunde #24 : Mai 11, 2005, 15:34:30 » |
|
Nu prea am inteles exact ce vrei sa zici! Deci tu acum folosesti BorlandC?! Si din ce motive nu poti sa folosesti DJGPP? Si ce "coduri de grafica avansata sub dos" folosesti?!
|
|
|
Memorat
|
|
|
|
|