>백엔드 개발 >C++ >C의 `scanf()`가 입력용 `cin`보다 정말 더 빠릅니까?

C의 `scanf()`가 입력용 `cin`보다 정말 더 빠릅니까?

Linda Hamilton
Linda Hamilton원래의
2024-11-23 10:38:111026검색

Is `scanf()` in C   Really Faster Than `cin` for Input?

C에서 scanf() 사용: cin보다 빠릅니까?

C에서는 입력에 cin과 cout을 사용하는 것이 널리 알려져 있습니다. printf 및 scanf를 사용하는 것보다 출력이 상당히 느립니다. 이는 scanf()가 C에 최적화되어 있고 cin 및 cout이 더 느린 표준 I/O 함수를 사용하여 구현된다는 가정에서 비롯됩니다.

벤치마크 결과

이 주장이 유효한지 확인하기 위해 표준 입력에서 숫자 목록을 읽고 XOR을 계산하는 프로그램과 관련된 간단한 벤치마크를 수행했습니다. 프로그램은 iostream 및 scanf 버전을 모두 사용하여 구현되었습니다:

iostream 버전:

#include <iostream>

int main() {
  int parity = 0;
  int x;

  while (std::cin >> x)
    parity ^= x;
  std::cout << parity << std::endl;

  return 0;
}

scanf 버전:

#include <stdio.h>

int main() {
  int parity = 0;
  int x;

  while (1 == scanf("%d", &x))
    parity ^= x;
  printf("%d\n", parity);

  return 0;
}

3,300만 개 이상의 난수로 구성된 대규모 데이터 세트로 테스트했을 때 scanf 버전은 6.4초인데 비해 iostream 버전은 24.3초로 실망스럽습니다.

최적화 영향

컴파일러 최적화 설정은 결과에 큰 영향을 미치지 않았습니다. 이는 속도 차이가 주로 scanf() 및 cin/cout 구현의 본질적인 차이로 인한 것임을 시사합니다.

범인: std::ios::sync_with_stdio

추가 조사에 따르면 iostream I/O 기능은 C I/O 기능과 동기화를 유지하는 것으로 나타났습니다. 기본적으로 이 동기화에는 각 입력 작업 후 출력 버퍼 플러시가 포함되어 성능이 저하됩니다.

동기화 비활성화

다행히도 이 동기화는 std를 호출하여 비활성화할 수 있습니다. ::ios::sync_with_stdio(false):

std::ios::sync_with_stdio(false);

비활성화 후 동기화를 통해 iostream 버전의 성능이 극적으로 향상되어 단 5.5초 만에 완료되었습니다.

C iostream Wins

동기화를 비활성화하면 C iostream이 더 빠른 옵션이 됩니다. 이 특정 벤치마크. std::cout의 내부 동기화가 iostream 성능 저하의 주요 원인인 것으로 밝혀졌습니다.

결론

scanf()를 사용하는 동안 일부에서는 더 빨라질 수 있습니다. 경우에 따라 std::ios::sync_with_stdio를 비활성화하면 iostream이 특히 다음과 같은 경우에 많은 시나리오에서 scanf보다 뛰어난 성능을 발휘할 수 있습니다. stdio와 iostream 기능의 혼합 사용을 피하세요.

위 내용은 C의 `scanf()`가 입력용 `cin`보다 정말 더 빠릅니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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