C에서 stdin의 줄을 읽는 것이 Python보다 훨씬 느린 이유는 무엇입니까?
배경:
C를 사용하여 stdin에서 문자열 입력 줄을 읽는 것은 Python에 상응하는 것보다 훨씬 느릴 수 있습니다. 이러한 불일치는 더 많은 시스템 호출이 필요한 C의 기본 설정으로 인해 발생합니다.
입력 스트림의 기본 동작:
기본적으로 C 입력 스트림 cin은 다음과 동기화됩니다. 표준 C I/O 라이브러리(stdio). 이 동기화를 통해 입력이 버퍼링되지 않고 한 번에 한 문자씩 읽혀집니다. 이 동작은 cin 스트림과 stdio 함수 간의 충돌을 방지하지만 성능 저하도 발생시킵니다.
시스템 호출 사용:
cin이 stdio와 동기화되면, 각 문자 읽기는 비용이 많이 드는 작업인 시스템 호출을 트리거합니다. 이러한 오버헤드는 특히 대량의 데이터를 읽을 때 입력 프로세스 속도를 크게 저하시킵니다.
해결책:
C에서 줄 읽기 성능을 향상하려면 비활성화할 수 있습니다. cin과 stdio 간의 동기화. 이는 sync_with_stdio(false) 메소드를 호출하여 달성할 수 있습니다.
또는 getline 대신 fgets 함수를 사용하면 동기화 오버헤드도 우회됩니다.
성능 비교:
다음은 원래(동기화된) 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 (not a fair comparison) | 54,644,808 |
결론:
cin과 stdio 간의 동기화를 비활성화하거나 fgets를 사용하면 C에서 줄 읽기 성능을 크게 향상시킬 수 있습니다. Python의 효율성과 비슷합니다.
위 내용은 stdin에서 줄을 읽을 때 C의 `cin`이 Python보다 현저히 느린 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!