Posts sync_with_stdio(false) cin.tie(NULL) cout.tie(NULL)
Post
Cancel

sync_with_stdio(false) cin.tie(NULL) cout.tie(NULL)

C++ 입출력 속도

C++의 cincoutscanfprintf보다 속도가 느리다.
출력은 큰 차이는 아니지만 입력같은 경우는 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++ 입출력 속도 줄이기

이제 그럼 cincout의 속도를 올리는 방법을 알아보자

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의 입출력을 쓰지 않도록 조심한다면
적어도 입출력 시간으로 고통받는 일은 없을것이다.

백준 2270 하노이 탑 c++

백준 9177 단어 섞기 c++

Comments powered by Disqus.