SORU
25 HAZİRAN 2009, PERŞEMBE


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
6 EKİM 2012, CUMARTESİ


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ı.

Kod: https://gist.github.com/3845568

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Sparta Spartanutul

    Sparta Spart

    18 HAZİRAN 2013
  • TantalizingTrance

    TantalizingT

    15 ŞUBAT 2009
  • TheDroidDemos

    TheDroidDemo

    15 ŞUBAT 2011