일반적으로 주요 입출력 방법의 속도 차이는 아래 표와 같다.
언어 | 입력 방법 | 평균(초) |
---|---|---|
C/C++17 | scanf | 0.798 |
C++17 | cin | 2.1742 |
C++17 | ios_base::sync_with_stdio(false); cin.tie(NULL); | 0.5938 |
C++17 | ios_base::sync_with_stdio(false); | 0.6348 |
언어 | 출력 방법 | 평균(초) |
---|---|---|
C/C++17 | printf | 0.8614 |
C++17 | ios_base::sync_with_stdio(false); cout << i << '\n'; | 0.827 |
C++17 | ios_base::sync_with_stdio(false); cout.tie(NULL); cout << i << '\n'; | 0.8272 |
C++17 | cout << i << '\n'; | 0.9229 |
C++17 | cout << i << endl; | 11.5322 |
가능하면 scanf, printf를 사용하는 게 좋겠지만
- 불가피하게 cin, cout을 써야만 할 때
- 그런데 성능은 매우 빨라야 할 때
하나의 수단으로 main 함수의 시작 부분에 아래와 같은 코드를 삽입할 수 있다.
cin.tie(NULL);
ios_base::sync_with_stdio(false);
이렇게 하면 cin, cout 을 사용해도 scanf, printf를 쓰는 것과 비슷한 속도를 만들어 낼 수 있다.
하지만 이 방법은 알고리즘 문제를 해결할 때에만 사용하고 가능하면 사용하지 않는 것이 좋다고 한다.
cin.tie(NULL)
기본적으로 cin과 cout은 stream buffer를 공유(tie)하고 있다.
즉, 입력 또는 출력 요청을 받게 되면, 실행 전 각각의 stream 버퍼를 확인하고 flush 하는 과정을 거치게 된다.
'std::cin.tie(NULL)'로 cin과 cout을 untie 해주게 되면, 이런 과정을 거치지 않기 때문에 속도가 빨라질 수 있다!
(참고 : https://sweetnew.tistory.com/32)
ios_base::sync_with_stdio(false)
- ios_base : cin, cout 등
- sync : 동기화
- stdio : printf, scanf, getchar, fgets, puts, putchar 등
따라서
ios_base::sync_with_stdio(false);
이 코드는
ios_base와 stdio와의 동기화를 하지 않음을 의미한다.
그러므로 동기화를 false 시킨 이후에는 cin / scanf를 같이 쓰거나 cout / printf를 같이 쓰면 문제가 발생할 수 있다.
즉, 멀티 쓰레드 환경이 아닌 단일 쓰레드 환경으로 만들어주어야 오류가 발생하지 않는다.
반응형
'에러 해결' 카테고리의 다른 글
[jekyll] 작성한 post가 보이지 않는 이슈 (0) | 2022.10.20 |
---|---|
No JVM shared library file (libjvm.so) found. Try setting up the JAVA_HOME environment variable properly 오류 해결 (0) | 2021.04.08 |
[iOS] iOS HTTP 통신 허용하기 (0) | 2020.06.22 |
Mac os vscode 컴파일 안되는 문제 (0) | 2020.03.29 |
Homebrew로 node 설치 시 발생한 오류 해결 (2) | 2020.03.27 |