ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • cout, cin 최적화 방법과 주의점
    Language/C++ 2020. 1. 30. 17:43

    cout과 cin의 속도를 빠르게 하기 위해서는

     

    1
    2
    3
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

     

    이 구문을 추가해주면 된다.

     

    하지만 이 구문이 단순히 최적화해주는 구문이라고 생각하고 사용하면 안된다.

     

    그 이유들을 설명하면

     

    1
    ios::sync_with_stdio(false);

     

    이 구문은 c와 c++ 입출력의 synchronization을 false로 바꿔준다.

     

    일반적으로 c++ 컴파일러는 c와 c++ 스타일의 입출력을 혼용하는 것을 허용하는데, 이를 구현하기 위해서 모든 표준 입출력들 또한 동기화 되어있다.

     

    그러한 동기화를 꺼줌으로써 c++ 입출력시 독립된 자신만의 버퍼를 사용하게 된다.

     

    이로 인해, 위 구문을 적용하고 cout, cin과 printf, scanf 등등 c와 c++의 입출력을 혼용할 경우 의도치 않은 결과가 나타날 수 있고, 일반적으로 PS에서는 쓰레드를 쓸 일이 없어서 큰 문제가 되지 않지만, 쓰레드 사용 시 여러 쓰레드가 동시에 입출력에 접근하는 경우가 생길 수 있어서 thread-safe 하지 않아진다.

    (thread-safe - 운영체제에서 mutex나 세마포어 등으로 동시 접근을 막는 것과 같이, 여러 쓰레드가 동시 접근해도 안전하다는 의미)

     

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

     

    이 구문은 cin과 cout이 묶여있는 것을 풀어준다.

     

    스택 오버플로우 글 ( https://stackoverflow.com/questions/31162367/ )을 참고하면

     

    1
    2
    std::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 선언 및 사용법  (8) 2020.01.29

    댓글

Designed by Tistory.