JLOG

[C++] 입출력 함수(cout, cin) 속도 개선 / ios_base::sync_with_stdio(false); cin.tie(null); 본문

Algorithm/팁

[C++] 입출력 함수(cout, cin) 속도 개선 / ios_base::sync_with_stdio(false); cin.tie(null);

정정선선 2021. 4. 11. 19:31

알고리즘 문제를 풀면서 cout과 cin보다 printf과 scanf의 속도가 더 빠르다는 것을 알았다. cout, cin를 사용할 때 속도를 높이려면 아래와 같은 구문을 추가해주면 된다고 한다.

// c와 c++ 입출력의 동기화를 사용하지 않음
ios::sync_with_stdio(false);

// cin과 cout의 묶음을 풀어줌
cin.tie(NULL);        
cout.tie(NULL);

 

 

구문 설명

ios::sync_with_stdio(false);

c++은 c의 입출력함수(printf, scanf)를 사용할 수 있다. 이 때 iostream과 stdio의 버퍼를 모두 사용하여 딜레이가 발생한다. c 입출력 동기화를 비활성화시켜, c++만의 독립적인 버퍼를 사용해 실행 속도를 개선시킨다.

 

멀티 쓰레드 환경에서는 출력 순서를 보장할 수 없다는 단점이 있다. 알고리즘 문제를 풀 때는 대부분 싱글 쓰레드 환경이기 때문에 문제가 발생하지 않는다고 한다.

 


 

cin.tie(NULL);        
cout.tie(NULL);

위 구문은 cin과 cout의 묶음을 풀어준다.

c++ 입출력함수는 입력버퍼와 출력버퍼가 묶여 있기 때문에 cin을 사용할 때 출력 버퍼를 먼저 비우고 값을 받아오게 된다. 입력과 출력이 반복되는 경우에는 반드시 cin와 cout의 묶음을 풀어줘야 한다.

 

 

주의점

ios_base::sync_with_stdio(false); 구문을 사용하면 C 입출력문을 혼용하면 안된다.

cin 입력과 cout 출력이 반복되는 경우에는 반드시 cin.tie(NULL); cout.tie(NULL);을 이용해서 cin와 cout의 묶음을 풀어줘야 한다.

 

 

참고 블로그

https://leeeegun.tistory.com/4

https://jaimemin.tistory.com/1521

 

 

 

 

Comments