/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
Sammenligning af iostream og stdio.h
Fra : Byrial Jensen


Dato : 27-10-02 11:08

Jeg stødte på følgende program på side 111 i "More Effective C++"
af Scott Meyers:

#ifdef STDIO
#include <stdio.h>
#else
#include <iostream>
#include <iomanip>
using namespace std;
#endif

const int VALUES = 30000;

int main()
{
double d;
for (int n = 1; n <= VALUES; ++n)
{
#ifdef STDIO
scanf("%lf", &d);
printf("%10.5f", d);
#else
cin >> d;
cout << setw(10)
<< setprecision(5)
    << setiosflags(ios::showpoint)
    << setiosflags(ios::fixed)
<< d;
#endif

if (n % 5 == 0)
{
#ifdef STDIO
printf("\n");
#else
cout << '\n';
#endif
}
}
return 0;
}

og fik selvfølgelig straks lyst til at teste det på min
Linux-maskine med gcc 3.1 med følgende resultat:

Køretid
Med brug af iostream: 1,7 s
Med brug af stdio.h: 0,2 s

(Testprogrammerne er oversat med optimeringsniveau -O2. Inddata er
de naturlige logaritmer af heltallene fra 1 til 30.000 i samme
format som programmerne selv udskriver. Uddata er dirigeret til
/dev/null).

Det undrer mig at der så stor forskel på de 2 udgaver. Scott
skriver:

I have run this program on several combinations of machines,
operating systems, and compilers, and in every case the stdio
version has been faster. Sometimes it's been only a little
faster (about 20%), sometimes it's been substantially faster
(nearly 200%)

Men i min måling er forskellen langt større end 200 %. Er det
glibc's stdio-implementation som er super hurtig, eller er det
gcc's iostream-implementation som er temmelig langsom?

--
Skal musik- og edb-industrien have ret til fratage forbrugerne deres
rettigheder i henhold til Ophavsretloven, begrænse konkurrencen og
fremme monopoldannelse ved hjælp af tekniske midler? Sig nej! Nu!
Støt underskriftsindsamlingen på http://www.digitalforbruger.dk

 
 
Claus Rasmussen (27-10-2002)
Kommentar
Fra : Claus Rasmussen


Dato : 27-10-02 22:17

Byrial Jensen wrote:

> og fik selvfølgelig straks lyst til at teste det på min
> Linux-maskine med gcc 3.1 med følgende resultat:
>
> Køretid
> Med brug af iostream: 1,7 s
> Med brug af stdio.h: 0,2 s

Med kommandoen 'time a.out <input.fil >/dev/null' får jeg:

Stdio
real 0m0.246s
user 0m0.230s
sys 0m0.010s

Iostream
real 0m0.303s
user 0m0.270s
sys 0m0.030s

'user' viser hvor megen tid selve programmet har brugt. 'sys' viser
hvor megen tid det har brugt på systemkald. Lidt afhængigt af omstæn-
digheder bruger man 'user' eller 'user+sys' som mål for hele kørslen.

Men uanset hvilken metode, man bruger, så er iostream en 20-25% lang-
sommere end stdio på min maskine.


> (Testprogrammerne er oversat med optimeringsniveau -O2. Inddata er

Du skal bruge -O3 . -O2 inliner ikke funktioner og iostream bruger
inlinede funktioner i stor stil.

-Claus


Byrial Jensen (28-10-2002)
Kommentar
Fra : Byrial Jensen


Dato : 28-10-02 20:35

Claus Rasmussen <clr@cc-consult.dk> skrev:
> Byrial Jensen wrote:
>
>> og fik selvfølgelig straks lyst til at teste det på min
>> Linux-maskine med gcc 3.1 med følgende resultat:
>>
>> Køretid
>> Med brug af iostream: 1,7 s
>> Med brug af stdio.h: 0,2 s
>
> Med kommandoen 'time a.out <input.fil >/dev/null' får jeg:
>
> Stdio
> real 0m0.246s
> user 0m0.230s
> sys 0m0.010s
>
> Iostream
> real 0m0.303s
> user 0m0.270s
> sys 0m0.030s

Mine tider var også målt med "time" og afrundet.

> Men uanset hvilken metode, man bruger, så er iostream en 20-25% lang-
> sommere end stdio på min maskine.
>
>> (Testprogrammerne er oversat med optimeringsniveau -O2. Inddata er
>
> Du skal bruge -O3 . -O2 inliner ikke funktioner og iostream bruger
> inlinede funktioner i stor stil.

Her er mine tider med -O3. Der er ingen signifikant forskel fra -O2:

Stdio
real 0m0.233s
user 0m0.230s
sys 0m0.000s

Iostream
real 0m1.655s
user 0m1.650s
sys 0m0.010s

Jeg bruger gcc 3.1 på en i686 med GNU/Linux (Red Hat 7.2 med diverse
opdateringer). Kan den store forskel mon skyldes en fejl i min
installation? Er der andre der har lignende resultater?

--
Skal musik- og edb-industrien have ret til fratage forbrugerne deres
rettigheder i henhold til Ophavsretloven, begrænse konkurrencen og
fremme monopoldannelse ved hjælp af tekniske midler? Sig nej! Nu!
Støt underskriftsindsamlingen på http://www.digitalforbruger.dk

Claus Rasmussen (28-10-2002)
Kommentar
Fra : Claus Rasmussen


Dato : 28-10-02 23:09

Byrial Jensen wrote:

> Jeg bruger gcc 3.1 på en i686 med GNU/Linux (Red Hat 7.2 med diverse
> opdateringer). Kan den store forskel mon skyldes en fejl i min
> installation? Er der andre der har lignende resultater?

Jeg glemte at fortælle, at jeg bruger gcc-2.96 på RedHat 7.3. Imple-
mentationen af stdlibc++ er ændret radikalt mellem de to versioner.

Den nye version er mere i overensstemmelse med standarden og er nu
thread-safe og har implementeret de i18n faciliteter, der manglede
i den gamle version. Det koster naturligvis performance sammenlignet
med stdio.

Men jeg synes stadig, at dine tal ser slemme ud. Jeg vil foreslå
dig at opgradere til gcc 3.2 og prøve igen. Både gcc og stdlibc++
er under heftig udvikling i øjeblikket, og man har i de første
versioner af gcc 3.x serien koncentreret sig mere om at opfylde
standarden end om performance. Men nu er fokus ved at flytte sig
til det performancemæssige.

Hvis du sidder med et konkret problem, hvor performance er vigtigt,
kan du evt. kigge på ext/stdio_filebuf.h, der fulgte med 3.1 men som
er fjernet fra gcc 3.2.

-Claus


Per Abrahamsen (29-10-2002)
Kommentar
Fra : Per Abrahamsen


Dato : 29-10-02 13:59

Claus Rasmussen <clr@cc-consult.dk> writes:

> Byrial Jensen wrote:
>
>> Jeg bruger gcc 3.1 på en i686 med GNU/Linux (Red Hat 7.2 med diverse
>> opdateringer). Kan den store forskel mon skyldes en fejl i min
>> installation? Er der andre der har lignende resultater?
>
> Jeg glemte at fortælle, at jeg bruger gcc-2.96 på RedHat 7.3. Imple-
> mentationen af stdlibc++ er ændret radikalt mellem de to versioner.

I nogle kombinationer af GCC og glibc er stdio og iostream opbygget på
en fælles backend, så synkronisering er automatisk og gratis. På
andre er GCC nødt til droppe bufferen på iostreams for at opfylde
standardens krav om at cout og stdout altid skal være synkroniserede.

Det kan også være en forskel, i så fald burde Byrial få helt andre
tider hvis han skriver til en fil i stedet for til cout/stdout.

> Men jeg synes stadig, at dine tal ser slemme ud. Jeg vil foreslå
> dig at opgradere til gcc 3.2 og prøve igen.

Der _burde_ ikke være forskel på 3.1 og 3.2, da 3.2 bare er et "bug
fix" release.

Søg
Reklame
Statistik
Spørgsmål : 177500
Tips : 31968
Nyheder : 719565
Indlæg : 6408509
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste