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

Adakah C IOStreams Sentiasa Lambat Daripada printf/scanf?

Barbara Streisand
Barbara Streisandasal
2024-11-06 15:55:02148semak imbas

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);

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;
}

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!

Kenyataan:
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