Вот быстрый тест простого случая: программа для чтения списка чисел из стандартного ввода и XOR для всех чисел.
версия iostream:
#include <iostream>
int main(int argc, char **argv) {
int parity = 0;
int x;
while (std::cin >> x)
parity ^= x;
std::cout << parity << std::endl;
return 0;
}
версия scanf:
#include <stdio.h>
int main(int argc, char **argv) {
int parity = 0;
int x;
while (1 == scanf("%d", &x))
parity ^= x;
printf("%d\n", parity);
return 0;
}
Полученные результаты
Используя третью программу, я создал текстовый файл, содержащий 33 280 276 случайных чисел. Сроки исполнения:
iostream version: 24.3 seconds
scanf version: 6.4 seconds
Изменение настроек оптимизации компилятора, похоже, не сильно повлияло на результаты.
Итак: разница в скорости действительно есть.
РЕДАКТИРОВАТЬ: Пользователь clyfish указывает ниже, что разница в скорости в значительной степени связана с функциями ввода-вывода iostream, поддерживающими синхронизацию с функциями CI / O. Мы можем отключить это с помощью вызова std::ios::sync_with_stdio(false);
:
#include <iostream>
int main(int argc, char **argv) {
int parity = 0;
int x;
std::ios::sync_with_stdio(false);
while (std::cin >> x)
parity ^= x;
std::cout << parity << std::endl;
return 0;
}
Новые результаты:
iostream version: 21.9 seconds
scanf version: 6.8 seconds
iostream with sync_with_stdio(false): 5.5 seconds
C ++ iostream побеждает! Оказывается, именно эта внутренняя синхронизация / очистка обычно замедляет ввод-вывод iostream. Если мы не смешиваем stdio и iostream, мы можем отключить его, и тогда iostream будет самым быстрым.
Код: https://gist.github.com/3845568