Hi,

I wrote the attached simple benchmark program to compare iostreams
and C stdio. Running it with -10000000 and 10000000 on the command
line on Linux 2.6.9 (GNU libc 2.5) I get the numbers below for each
of the implementations I tried when using /dev/null and /tmp/file
as the sink:

                 /dev/null      /tmp/file
                CLK:USR:SYS    CLK:USR:SYS

stdio           28s:27s:0.0s   32s:28s:1.8s
g++ 4.1.1       42s:42s:0.0s   44s:42s:2.0s
stdcxx trunk    40s:41s:0.0s   49s:41s:5.8s
STLport 5.1.3   27s:27s:0.0s   30s:27s:2.3s

The CLK, USR, and SYS abbreviations stand for wall clock, user time,
and system time. In all cases I used -D_REENTRANT, -O2 and -pthread
to compile and link.

-- Mark
#include <cstdio>
#include <cstdlib>
#include <ios>
#include <iostream>
#include <fstream>

const char* strings[] = {
    "zero", "one", "two", "three", "four", "five", "six", "seven", "eight",
    "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen",
    "sixteen", "seventeen", "eighteen", "nineteen", "twenty"
};

int test (int from, int to, const char *fname, bool stdio = false)
{
    if (stdio) {

        std::cout << "Running stdio loop: " << from << ", " << to << '\n';

        std::FILE* f = std::fopen (fname, "w");
        if (!f)
            return 1;

        for (int i = from; i < to; ++i) {
            short  s = i;

            const char* str =
                strings [i % (sizeof strings / sizeof *strings)];

            if (0 > std::fprintf (f, "\"%s\" %hd %x\n", str, s, i)) {
                std::cerr << "Error writing " << fname << " at " << i << '\n';
                return 1;
            }
        }

        return 0;
    }

    std::cout << "Running iostream loop: " << from << ", " << to << '\n';

    std::ofstream strm (fname);

    for (int i = from; i < to; ++i) {
        short s = i;

        const char* str =
            strings [i % (sizeof strings / sizeof *strings)];

        if (!(strm << '"' << str << "\" "
              << s << ' '
              << i << ' '
              << '\n')) {
            std::cerr << "Error writing " << fname << " at " << i << '\n';
            return 1;
        }
    }

    return 0;
}

int main (int argc, char *argv [])
{
    int from = 1 < argc ? std::atoi (argv [1]) : 0;
    int to = 2 < argc ? std::atoi (argv [2]) : 0;
    const char* fname = 3 < argc ? argv [3] : "/dev/null";
    bool stdio = 4 < argc;

    test (from, to, fname, stdio);
}

Reply via email to