Andy La Rubin (larubin) wrote,
Andy La Rubin
larubin

printf vs iostream

Вчерашнее открытие натолкнуло местных жителей на старый спор, что же круче - C-like printf либо C++-like iostream. Аргументы сторон такие:

1) printf сильно короче записывается и быстрее работает, потому что нет лишних вызовов функций.
2) iostream быстрее работает, потому что всё пре-компилируется через инлайны и нет никакой рантаймовой обработке.

Решили, что практика - лучший критерий истины, посему пишем два примера и проверяем, что быстрее (и что короче). Вот мой пример:

#include <stdio.h>

int main()
{
    char buffer[1024];

    int a = 256;
    int b = 0xbaadf00d;
    float c = 3.1415926535;
    char d[] = "17 symbols string";
    
    sprintf(buffer, "%010d %X %+*.*f %.5s", a, b, 3, 2, c, d);
}


В buffer в результате будет "0000000256 BAADF00D +3.14 17 sy"

C++-гай задумался и пошел переписывать его на плюсах. Ждём (timer started).

9:47 Возникли сомнения, что %.5s можно сделать на плюсах
9:55 Радостная новость - нам удалось отформатировать a!
10:00 Расправились с b...
10:10 С++ готов!

#include <string>
#include <sstream>
#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
    int a = 256;
    int b = 0xbaadf00d;
    float c = 3.1415926535;
    char d[] = "17 symbols string";

    stringstream stream;
    
    stream << setfill('0') << setw(10) << a << " "
        << hex << uppercase << b << " "
        << showpos << setprecision(3) << c << " "
        << string(d, d+5);
}

В последней строке не обошлось без С-хака ;)

10:30 Результаты прогона на вижуальнике (единицы измерения - относительное время):

С: 3.8
C++: 6.2 (без оптимизации - 12.1)

gcc-4.2: 0.6
g++-4.2: 1.8 (без оптимизации 2.2)

clang - аналогично gcc/g++

Выводы: printf торчит, стримы сосут.
Tags: prog
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 16 comments