Ось швидкий тест простого випадку: програма для зчитування списку чисел зі стандартного введення та 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
Зміна параметрів оптимізації компілятора, схоже, зовсім не змінила результати.
Таким чином: дійсно є різниця швидкостей.
EDIT: Користувач clyfish вказує нижче, що різниця швидкостей значною мірою пов'язана з функціями iostream I / O, що підтримують синхронізацію з функціями 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 i / o. Якщо ми не змішуємо stdio і iostream, ми можемо вимкнути його, і тоді iostream буде найшвидшим.
Код: https://gist.github.com/3845568