Pagini: [1]   În jos
  Imprimă  
Ajutor Subiect: C vs C++  (Citit de 1459 ori)
0 Utilizatori şi 1 Vizitator pe acest subiect.
crawler
Vorbaret
****

Karma: 105
Deconectat Deconectat

Mesaje: 161



Vezi Profilul
« : Aprilie 01, 2009, 19:12:17 »

tot am vazut pe forum ca se recomanda citirea cu streamuri .... asa ca am facut un programel de test

Cod:
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <time.h>

using namespace std;

int n = 1000000;
double start,stop;
int QWERTY = 1, LOL = 123456789;

void init()
{
     QWERTY = 123456789;     
}

int numar_random()
{
     QWERTY += LOL;
     return QWERTY;     
}

double timp()
{
     return (stop-start)/1000;
}

void test_scanf()
{
     init();
     printf("test stdio.h\n");
     
     //scriere
     start = clock();

     FILE *f = fopen("ceva.txt","w");
     
     int tmp;
     long long suma=0;
     
     for (int i=1;i<=n;++i)
     {
          tmp = numar_random();
          suma += tmp;
          fprintf(f,"%d\n", tmp);
     }
         
     fclose(f);         
     stop = clock();
     
     printf("a scris %d numere in %.2f secunde\n", n,timp());
     
     printf("suma lor este %lld\n", suma);

     //citire     


     start = clock();

     f = fopen("ceva.txt","r");

     suma = 0;
     for (int i=1;i<=n;++i)
     {
          fscanf(f,"%d", &tmp);
          suma += tmp;
     }         
         
     fclose(f);         
     
     stop = clock();
     
     printf("a citit %d numere in %.2f secunde\n", n,timp());
     printf("suma lor este %lld\n", suma);
     
}

void test_streamuri()
{
     init();
     
     printf("test streamuri\n");

     //scriere     
     start = clock();
     
     ofstream out("ceva.txt");

     int tmp;
     long long suma=0;


     for (int i=1;i<=n;++i)
     {
          tmp = numar_random();
          suma += tmp;
          out<<tmp<<'\n';
     }


     out.close();
     
     stop = clock();
     
     //citire
     printf("a scris %d numere in %.2f secunde\n", n,timp());
     printf("suma lor este %lld\n", suma);
     
     start = clock();

     ifstream in("ceva.txt");
     
     suma = 0;
     
     for (int i=1;i<=n;++i)
     {
          in>>tmp;
          suma += tmp;
     }         

         
     in.close();
     
     stop = clock();
     
     printf("a citit %d numere in %.2f secunde\n", n,timp());
     printf("suma lor este %lld\n", suma);     
}

int main()
{
     test_scanf(); 
     
     test_streamuri();
     
     scanf("\n");
     
     return 0;   
}

iata ce rezultate am avut

pentru 1 miliard de numere intregi (int)

stdio.h

scriere: 90.3 secunde
citire: 75.22 secunde

fstream

scriere: 65.42 secunde
citire: 97.38 secunde
 

de ce se recomanda citirea cu streamuri daca e mai inceata ? Tongue
Memorat
wefgef
Nu mai tace
*****

Karma: 1049
Deconectat Deconectat

Mesaje: 3.008


razboinicu' luminii


Vezi Profilul
« Răspunde #1 : Aprilie 01, 2009, 19:18:01 »

Ce compilator de C++ ai?

P.S.: La concursuri cel mai sigur este sa folosesti functiile standard C. Nu poti sti niciodata cum merg streamurile pe compilatorul oficial.
Memorat

omului i-au fost date instinctele pentru a supravietui, nu pentru a fi sclavul lor.
alexandru92
Nu mai tace
*****

Karma: -191
Deconectat Deconectat

Mesaje: 496



Vezi Profilul
« Răspunde #2 : Aprilie 01, 2009, 20:15:51 »

Citat
de ce se recomanda citirea cu streamuri daca e mai inceata ?
Nu poti zice ca  functiile din stdio.h is mai rapide decat cele din fstream.h si invers. Totul depinde de compilatorul pe care il folosesti, tipurile de date pe care le folosesti, sistemul de operare mai are ceva de zis din cand in cand, etc.

scuze n-am fost atent Very Happy.

 
« Ultima modificare: Aprilie 01, 2009, 20:29:02 de către alexandru » Memorat
crawler
Vorbaret
****

Karma: 105
Deconectat Deconectat

Mesaje: 161



Vezi Profilul
« Răspunde #3 : Aprilie 01, 2009, 23:09:58 »

am testat cu compilatorul de pe infoarena ...

streamuri
scriere+citire http://infoarena.ro/job_detail/293671
scriere http://infoarena.ro/job_detail/293676

standard
scriere+citire http://infoarena.ro/job_detail/293670
scriere http://infoarena.ro/job_detail/293677

rezultate interesante Smile

cea mai importanta observatie e ca desi sursa face acelasi lucru de fiecare data cand este rulata, timpii afisati de monitor sunt diferiti ...
si a doua e ca nu prea exista diferente in timp ... pentru 5 milioane de numere scrise si citite diferenta e de vreo 0.5 - 0.7 ... diferenta intre timpul de scriere este tot cam de 0.5 - 0.7 ... concluzia mea e ca merg la fel de repede la citire

parsare
scriu 5 mil numere cu fprintf si citesc 5 milioane cu o functie de parsare
http://infoarena.ro/job_detail/293692

aici doar le scriu
http://infoarena.ro/job_detail/293687

diferenta de timp este vreo 0.3 - 0.5 secunde (adica timpul in care citesc cu parsare)

de aproximativ 7 ori mai rapid decat oricare alta citire Tongue
Memorat
bogdan2412
Echipa infoarena
Nu mai tace
*****

Karma: 410
Deconectat Deconectat

Mesaje: 951



Vezi Profilul
« Răspunde #4 : Aprilie 02, 2009, 08:20:34 »

Nu stiu in ce masura e un test bun sa citesti dintr-un fisier in care tocmai ai scris. In principiu linuxul il tine cache-uit in memorie si probabil d-aia sunt si diferente asa mari in timpu de executie pentru sursele care fac scriere+citire... Cele cu scriere au timpi mult mai apropiati.

Din cate tin minte diferentele mari intre scanf si cin+freopen(stdin) erau mari pentru ca cin era facut pentru cititul de la consola si folosea un buffer mic. Daca se folosea un ifstream, diferentele nu mai erau sesizabile.

Oricum intr-un concurs nu pe asta ar trebui sa se faca diferenta Smile
Memorat
Pagini: [1]   În sus
  Imprimă  
 
Schimbă forumul:  

Powered by SMF 1.1.19 | SMF © 2006-2013, Simple Machines