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 중국어 웹사이트의 기타 관련 기사를 참조하세요!