-
cout, cin 최적화 방법과 주의점Language/C++ 2020. 1. 30. 17:43
cout과 cin의 속도를 빠르게 하기 위해서는
123ios::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);이 구문을 추가해주면 된다.
하지만 이 구문이 단순히 최적화해주는 구문이라고 생각하고 사용하면 안된다.
그 이유들을 설명하면
1ios::sync_with_stdio(false);이 구문은 c와 c++ 입출력의 synchronization을 false로 바꿔준다.
일반적으로 c++ 컴파일러는 c와 c++ 스타일의 입출력을 혼용하는 것을 허용하는데, 이를 구현하기 위해서 모든 표준 입출력들 또한 동기화 되어있다.
그러한 동기화를 꺼줌으로써 c++ 입출력시 독립된 자신만의 버퍼를 사용하게 된다.
이로 인해, 위 구문을 적용하고 cout, cin과 printf, scanf 등등 c와 c++의 입출력을 혼용할 경우 의도치 않은 결과가 나타날 수 있고, 일반적으로 PS에서는 쓰레드를 쓸 일이 없어서 큰 문제가 되지 않지만, 쓰레드 사용 시 여러 쓰레드가 동시에 입출력에 접근하는 경우가 생길 수 있어서 thread-safe 하지 않아진다.
(thread-safe - 운영체제에서 mutex나 세마포어 등으로 동시 접근을 막는 것과 같이, 여러 쓰레드가 동시 접근해도 안전하다는 의미)
12cin.tie(NULL);cout.tie(NULL);이 구문은 cin과 cout이 묶여있는 것을 풀어준다.
스택 오버플로우 글 ( https://stackoverflow.com/questions/31162367/ )을 참고하면
12std::cout << "Enter name:";std::cin >> name;위와 같은 코드 실행시 untie되어있다면 콘솔 상에서 Enter name이 출력되지 않는다고 설명되어있다.
그러나 VS상에서 돌려보니 정상적으로 출력된다..
이 부분은 명확하게 설명하고 있는 곳은 없으나, 실제 백준에서 여러 알고리즘을 돌려보면 cin과 cout의 tie 해제시 출력 500만번 기준 약 8ms 정도의 속도 상승을 확인했다.
정리하면 위의 구문들을 사용할 때, c와 c++의 입출력을 혼용하지 않아야 하며, thread 사용에 주의해야한다.
'Language > C++' 카테고리의 다른 글
[C++ STL] Sort() 사용법 및 compare 함수 (0) 2020.01.31 [C++ STL] 2차원 vector 선언 및 사용법 (9) 2020.01.29