C++ 입출력 속도
C++의 cin
과 cout
은 scanf
와 printf
보다 속도가 느리다.
출력은 큰 차이는 아니지만 입력같은 경우는 2배 이상의 속도 차이가 난다.
그렇기 때문에 백준의 특정 문제에서는
입출력 속도 차이로 문제를 틀리는 경우가 존재한다.
실제 시간이 어느정도 걸리는지 알아보면
입력의 경우
scanf
를 쓰는 경우 평균 0.9206초가 걸리고
cin
을 쓰는 경우는 평균 2.1742초가 걸렸다.
출력의 경우 printf
를 쓰는 경우 평균 0.8614초가 걸리고
cout
을 쓰는 경우는 평균 0.9229초가 걸렸다.
실험 결과는 백준을 참고했다.
https://www.acmicpc.net/blog/view/56
https://www.acmicpc.net/blog/view/57
C++ 입출력 속도 줄이기
이제 그럼 cin
과 cout
의 속도를 올리는 방법을 알아보자
1
2
3
4
5
6
7
8
#include<iostream>
using namespace std;
int main() {
ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
return 0;
}
ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
위 코드를 사용하게 되면 C와 C++사이의 stream 동기화를 끊는다.
동기화를 끊음으로서 C++ stream들은 독립적인 buffer를 갖게되고
buffer의 수가 줄어들며 속도가 빨라지게 된다.
하지만 이전 포스트에도 썼듯이
위 코드를 쓰게되면 C의 표준 입출력을 섞어쓰면 안된다.
그렇게되면 백준같은 곳에서는 오류가 나며 문제를 틀리게 된다. 예를 들어 scanf
, printf
, getchar
등의 함수를 쓸 수 없는 것이다.
또한 싱글스레드 환경에서만 써야한다고 하는데
PS를 하면서 멀티스레드를 쓸 일은 없으니 패스한다.
그럼 동기화를 끊는다면 속도가 어느정도 빨라질까
동기화를 끊은 후 cin
를 쓰는 경우 평균 0.5938초가 걸린다.
scanf
와 비교해보면 거의 2배 가까이 빠른 속도를 보여준다.
cout
같은 경우는 평균 0.8272초로 거의 차이가 안난다.
위 코드를 기본적으로 쓰는 습관을 들이고
C의 입출력을 쓰지 않도록 조심한다면
적어도 입출력 시간으로 고통받는 일은 없을것이다.