Scanf() kullanarak C programlarının cin kullanarak daha hızlıdır?
EÄŸer bu doÄŸruysa bilmiyorum, ama sorun sitelerine saÄŸlayan bir SSS okurken, dikkatimi poke bir ÅŸey buldum:
Giriş/çıkış yöntemleri kontrol edin. C , cin ve print kullanarak çok yavaş. Bu kullanım ve giriş veya çıkış iyi bir miktar ile herhangi bir sorunu çözmek mümkün değil varlık için söz vereceksin. Printf ve scanf yerine kullanın.
Biri bunu açıklayabilir miyim? Gerçekten kullanıyor() scanfC programları daha hızlı kullanmaktan daha? Evet, bu C programlarında kullanmak için iyi bir uygulamadır? Sadece C öğreniyorum C rağmen özel olduğunu düşünüyordum
CEVAP
Burada basit bir olgu hızlı bir test: standart giriş ve XOR dan numaralarının bir listesini okumak için bir program numaraları.
sürüm 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;
}
sürüm 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;
}
Sonuçları
Üçüncü bir programı kullanarak, bir metin dosyası 33,280,276 rasgele sayılar içeren oluşturdum. Yürütme süreleri:
iostream version: 24.3 seconds
scanf version: 6.4 seconds
Derleyici optimizasyon ayarları değiştirme sonuçları hiç de fazla bir değişiklik görünmüyordu.
Böylece gerçekten bir hız farkı var.
DÜZENLEME:Kullanıcı hız farkı O fonksiyonları G/Ç işlevleri C ile senkronizasyon bakımı/iostream büyük ölçüde bağlı olduğunu points out below clyfish. Bu std::ios::sync_with_stdio(false);
bir çağrı ile kapatabiliriz:
#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 bulgular:
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 / kızarma normalde iostream G/Ç yavaşlar ne olduğu ortaya çıktı. Eğer cstdio ve iostream karıştırma olursak, kapatabiliriz, ve sonra iostream hızlı.
Bir işlevi onları yaratan daha büyük k...
Doğrulama Sunucu Veritabanı Varlık Çer...
Çarpma ve bölme C shift operatörleri k...
Kullanarak birden fazla dosya ile daha...
Dinamik olarak kendi başına 1=1 kullan...