Вот быстрый тест простого случая: программа для чтения списка чисел со стандартного ввода и 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, поддерживающими синхронизацию с функциями C I / 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 i / o. Если мы не смешиваем stdio и iostream, мы можем отключить его, и тогда iostream будет самым быстрым.
код: https://gist.github.com/3845568