Rumah > pembangunan bahagian belakang > C++ > Adakah C IOStreams Sentiasa Lambat Daripada printf/scanf?

Adakah C IOStreams Sentiasa Lambat Daripada printf/scanf?

Barbara Streisand
Lepaskan: 2024-11-06 15:55:02
asal
244 orang telah melayarinya

Is C   IOStreams Always Slower Than printf/scanf?

Strategi untuk Meningkatkan Prestasi IOStream

Kebanyakan pengaturcara C lebih suka fungsi printf/scanf apabila mengekod dalam C , memetik antara muka unggul mereka. Walau bagaimanapun, IOStreams sering menghadapi kebimbangan prestasi.

Pengoptimuman Penimbalan

Meningkatkan saiz penimbal meningkatkan prestasi dengan mengurangkan hit HDD dan panggilan sistem. Ini boleh dicapai dengan mengakses streambuf asas dan mengubah suai penimbalnya:

char Buffer[N];

std::ifstream file("file.txt");

file.rdbuf()->pubsetbuf(Buffer, N);
Salin selepas log masuk

Pengendalian Tempatan

Locales boleh memperkenalkan overhed prestasi disebabkan oleh operasi yang kompleks seperti penukaran aksara dan penapisan. Pertimbangkan untuk menggunakan tempat C lalai, direka untuk keseragaman dan penukaran minimum.

Penyegerakan

Menyegerakkan dengan stdio nampaknya tidak meningkatkan prestasi. Walau bagaimanapun, adalah mungkin untuk mengakses tetapan global menggunakan std::ios_base::sync_with_stdio.

Pengukuran dan Keputusan

Hasil prestasi berbeza dengan ketara bergantung pada pelaksanaan dan platform. Sesetengah pengguna telah melaporkan C IOStreams yang lebih pantas, manakala yang lain mengalami prestasi yang lebih perlahan.

Kod Penanda Aras

Bagi mereka yang berminat untuk menjalankan penanda aras mereka sendiri, berikut ialah contoh kod:

template <typename Func>
double benchmark(Func f, size_t iterations)
{
  f();

  timeval a, b;
  gettimeofday(&a, 0);
  for (; iterations--;)
  {
    f();
  }
  gettimeofday(&b, 0);
  return (b.tv_sec * (unsigned int)1e6 + b.tv_usec) -
         (a.tv_sec * (unsigned int)1e6 + a.tv_usec);
}

struct CRead
{
  CRead(char const* filename): _filename(filename) {}

  void operator()() {
    FILE* file = fopen(_filename, "r");

    int count = 0;
    while (fscanf(file,"%s", _buffer) == 1) { ++count; }

    fclose(file);
  }

  char const* _filename;
  char _buffer[1024];
};

struct CppRead
{
  CppRead(char const* filename): _filename(filename), _buffer() {}

  enum { BufferSize = 16184 };

  void operator()() {
    std::ifstream file(_filename, std::ifstream::in);

    file.rdbuf()->pubsetbuf(_buffer, BufferSize);

    int count = 0;
    std::string s;
    while (file >> s) { ++count; }
  }

  char const* _filename;
  char _buffer[BufferSize];
};

int main(int argc, char* argv[])
{
  size_t iterations = 1;
  if (argc > 1) { iterations = atoi(argv[1]); }

  char const* oldLocale = setlocale(LC_ALL,"C");
  if (strcmp(oldLocale, "C") != 0) {
    std::cout << "Replaced old locale '" << oldLocale << "' by 'C'\n";
  }

  char const* filename = "largefile.txt";

  CRead cread(filename);
  CppRead cppread(filename);

  bool oldSyncSetting = std::ios_base::sync_with_stdio(false);

  double ctime = benchmark(cread, iterations);
  double cpptime = benchmark(cppread, iterations);

  std::ios_base::sync_with_stdio(oldSyncSetting);

  std::cout << "C  : " << ctime << "\n"
               "C++: " << cpptime << "\n";

  return 0;
}
Salin selepas log masuk

Atas ialah kandungan terperinci Adakah C IOStreams Sentiasa Lambat Daripada printf/scanf?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan