>백엔드 개발 >C++ >C 표준 입력 읽기가 Python보다 느린 이유는 무엇이며 어떻게 개선할 수 있습니까?

C 표준 입력 읽기가 Python보다 느린 이유는 무엇이며 어떻게 개선할 수 있습니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-26 16:29:09386검색

Why is C   Standard Input Reading Slower Than Python's, and How Can It Be Improved?

C 표준 입력 읽기가 Python의 효율성에 비해 부족한 이유

표준에서 문자열 입력 행을 읽는 데 Python과 C의 성능을 비교하면서 입력(stdin)에서 눈에 띄는 차이가 나타났습니다. C 코드가 상당히 느리게 실행되었습니다. 이로 인해 이러한 성능 격차의 근본 원인에 대한 조사가 시작되었습니다.

이 문제는 C의 기본 설정에서 발생합니다. 기본적으로 cin과 같은 istream은 stdio와 동기화되므로 입력 버퍼링이 방지됩니다. 성능을 최적화하려면 std::ios_base::sync_with_stdio(false) 문을 사용하여 이 동기화를 비활성화할 수 있습니다. 이러한 조정은 주요 성능 제약을 완화합니다.

표준 입력 스트림은 Python과 C 간의 설계에 따라 다르게 작동합니다. Python은 일반적으로 버퍼링되는 반면 C는 기본적으로 버퍼링되지 않습니다. 일반적인 상황에서 버퍼링은 시스템 호출을 줄여 효율성을 향상시킵니다. 그러나 C에서 FILE* 기반 stdio 및 iostream의 별도 구현 및 버퍼는 함께 사용할 때 잠재적인 문제를 야기합니다.

버퍼 불일치 및 예상치 못한 결과를 방지하기 위해 C는 기본적으로 스트림을 stdio와 동기화합니다. 이는 잠재적인 문제를 방지하지만 특히 대량의 입력을 처리할 때 오버헤드가 발생합니다.

최대 성능을 달성하기 위해 프로그래머는 sync_with_stdio 메서드를 사용하여 동기화를 비활성화할 수 있습니다. 이 최적화를 통해 C 표준 스트림이 독립적으로 버퍼링되어 특정 시나리오에서 속도가 크게 향상됩니다.

성능 벤치마크

보다 포괄적인 비교를 위해 다음은 다양한 접근 방식을 사용한 성능 벤치마크입니다. :

Implementation Lines per second
Python (default) 3,571,428
cin (default/naive) 819,672
cin (no sync) 12,500,000
fgets 14,285,714
wc 54,644,808 (Not a fair comparison)

분명히 동기화를 비활성화하고 fgets를 사용하면 C의 성능이 눈에 띄게 향상됩니다. .

위 내용은 C 표준 입력 읽기가 Python보다 느린 이유는 무엇이며 어떻게 개선할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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