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

  • footiecyclo

    footiecyclo

    26 EYLÜL 2009
  • Slave Boy Films - Fandom from a Galaxy Far Far Away

    Slave Boy Fi

    12 HAZİRAN 2009
  • thepoke64738

    thepoke64738

    17 HAZİRAN 2011

İLGİLİ SORU / CEVAPLAR