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