>백엔드 개발 >C++ >C IOStream은 항상 printf/scanf보다 느립니까?

C IOStream은 항상 printf/scanf보다 느립니까?

Barbara Streisand
Barbara Streisand원래의
2024-11-06 15:55:02242검색

Is C   IOStreams Always Slower Than printf/scanf?

IOStream 성능 향상 전략

대부분의 C 프로그래머는 C로 코딩할 때 우수한 인터페이스를 이유로 printf/scanf 기능을 선호합니다. 그러나 IOStream은 종종 성능 문제에 직면합니다.

버퍼링 최적화

버퍼 크기를 늘리면 HDD 히트 및 시스템 호출이 줄어들어 성능이 향상됩니다. 이는 기본 streambuf에 액세스하고 해당 버퍼를 수정하여 달성할 수 있습니다.

char Buffer[N];

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

file.rdbuf()->pubsetbuf(Buffer, N);

로캘 처리

로캘은 문자 변환과 같은 복잡한 작업으로 인해 성능 오버헤드를 초래할 수 있습니다. 필터링. 균일성과 최소 변환을 위해 설계된 기본 C 로케일을 사용하는 것이 좋습니다.

동기화

stdio와의 동기화는 성능을 향상시키지 않는 것으로 보입니다. 그러나 std::ios_base::sync_with_stdio를 사용하여 전역 설정에 액세스할 수 있습니다.

측정 및 결과

성능 결과는 구현 및 플랫폼에 따라 크게 다릅니다. 일부 사용자는 더 빠른 C IOStream을 보고한 반면 다른 사용자는 느린 성능을 경험했습니다.

벤치마킹 코드

자체 벤치마크 실행에 관심이 있는 사용자를 위한 샘플 코드는 다음과 같습니다.

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

위 내용은 C IOStream은 항상 printf/scanf보다 느립니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.