İşte basit bir durumun hızlı bir testi: standart girişten sayıların bir listesini okuyan bir program ve tüm sayıları XOR.
iostream sürümü:
#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 sürümü:
#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;
}
Sonuçlar
Üçüncü bir program kullanarak 33,280,276 rastgele sayı içeren bir metin dosyası oluşturdum. Uygulama süreleri:
iostream version: 24.3 seconds
scanf version: 6.4 seconds
Derleyicinin optimizasyon ayarlarını değiştirmek, sonuçları pek değiştirmemiş gibi görünüyordu.
Bu nedenle: gerçekten bir hız farkı var.
DÜZENLEME: Kullanıcı clyfish aşağıda hız farkının büyük ölçüde CI / O işlevleriyle senkronizasyonu sağlayan iostream I / O işlevlerinden kaynaklandığını belirtiyor. Bunu şu numarayı arayarak kapatabiliriz 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;
}
Yeni sonuçlar:
iostream version: 21.9 seconds
scanf version: 6.8 seconds
iostream with sync_with_stdio(false): 5.5 seconds
C ++ iostream kazandı! Bu dahili senkronizasyon / yıkama işleminin normalde iostream i / o'yu yavaşlatan şey olduğu ortaya çıktı. Standart ve iostream'i karıştırmıyorsak, onu kapatabiliriz ve sonra iostream en hızlısıdır.
Kod: https://gist.github.com/3845568