printf, scanf를 사용했을 때 A/C를 받았지만 cout, cin을 사용했을 때 시간초과가 나는 경우가 있다.
이는 cout, cin이 printf, scanf보다 실행 속도가 느리기 때문에 발생한다. 평소에는 시간 차이가 별로 없지만 입력이나 출력이 몇 십만 정도로 많아지면 시간이 크게 차이나게 된다.
cout과 cin의 속도를 빠르게 하기 위해서는 아래 코드를 추가해 주면 된다.
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
ios::sync_with_stdio(false);
ios::sync_with_stdio는 cpp의 iostream을 c의 stdio와 동기화시켜주는 역할을 한다. iostream, stdio의 버퍼를 모두 사용하기 때문에 딜레이가 발생하게 된다. ios::sync_with_stdio(false)는 이 동기화 부분을 끊는 함수이다. 이 함수를 사용하면 C++만의 독립적인 버퍼를 생성하게 되고 C의 버퍼들과 병행하여 사용할 수 없게 된다. 대신 사용하는 버퍼의 수가 줄어들었기 때문에 속도는 빨라진다.
cin.tie(NULL);
디폴트는 cout, cin이 tie되어 있다. 만약 코드에서
cout << "hi";
cin >> name;
이 순서라면 디폴트의 경우 "hi"가 먼저 출력되고 name을 입력할 것이다. 그러나 untie의 경우에는 cout으로 cin을 untie해주기 때문에 입력부터 하게 된다.
그러나 "hi"는 보이지 않는데, cout은 디폴트에서 출력 명령을 내리거나 버퍼가 가득 찼을 경우에만 flushed되고 출력되기 때문이다. cin을 cout에서 untie하고 싶다면 cin으로 입력하기 전에 cout으로 출력을 할 때마다 지속적으로 flush 해주어야 한다. 그래야 cout을 하고 cin을 하고 싶을 때 순서대로 프로그램이 실행된다.
또한 개행을 하기 위해 endl과 "\n"을 사용하는데 endl의 경우 flush() 함수를 겸하기 때문에 실행마다 출력 버퍼를 지워주는 과정(flush)이 생겨 "\n" 보다 속도가 느리다. 따라서 시간 초과가 발생할 경우 endl을 "\n"으로 바꿔주면 된다.
성능면에서 cout << endl 보다는 cout <<"\n" 가, cout << "\n"보다는 prinft("%d\n") 가 더 빠르다.
'Language > C++' 카테고리의 다른 글
[C++] STL - 읽기 알고리즘 함수 (find, for_each) (0) | 2021.11.06 |
---|---|
[C++] STL - pair, tuple (0) | 2021.11.06 |
[C++] STL - 컨테이너 어댑터(container adapter) [stack, queue] (0) | 2021.11.01 |
[C++] STL - 연관 컨테이너(associate container) [set, multiset, map, multimap] (0) | 2021.11.01 |
[C++] STL - 시퀀스 컨테이너(sequence container) [vector, deque, list] (0) | 2021.10.31 |