노트

c++) 입출력 관련 속도

tose33 2021. 4. 14. 18:40

1. endl은 '\n'보다 훨씬 처리속도가 느리다.

 

2. ios::sync_with_stdio는 c++의 iosteram을 c의 stdio와 동기화 시킨다. 

즉 c++ 입출력 연산들이 이에 대응되는 c 스트림 버퍼를 직접 사용한다. 

따라서 ios::sync_with_stdio(1) 즉 true로 주면, c++입출력 연산(std::cin, std::cout 등)과 c 입출력 연산을 혼합해 사용할 수 있다.  

 

ios::sync_with_stdio(0) 즉 false 라면 동기화가 끊기고 사용하는 버퍼의 수가 줄어들기 때문에 실행속도가 향상된다.

이때 c++입출력 연산과 c 입출력 연산들을 같이 사용하면 그 입출력 순서들이 보장 되지 않는다.

예를들어 

cout << "HI";
printf("BYE");
cout << "hi";

이것이 순서대로 출력되지만, false라면 그 순서가 보장되지 않는다.

따라서 true일때는 c++ 입출력 연산(iostream)인 cin,cout을

c입출력 연산(stdio) 함수인 getchar() 등과 같이 쓰면 안된다.

 

 

참고(modoocode.com/281, www.acmicpc.net/board/view/8074,

eine.tistory.com/entry/CC-%EC%9E%85%EC%B6%9C%EB%A0%A5-%EB%B0%A9%EB%B2%95%EC%97%90-%EB%94%B0%EB%A5%B8-%EC%86%8D%EB%8F%84-%EC%A0%95%EB%A6%AC)

 

 

3. cin.tie(NULL), cout.tie(NULL)

cin을 cout으로부터 untie 한다.

stream을 tie하면 다른 stream에서 입출력요청이 오기전에 stream을 flush 시킨다.

실행속도가 상승한다. 

(참고: su-m.tistory.com/7, leeeegun.tistory.com/4)

 

 

정리하자면, 

1. c함수인 printf, scanf를 사용하고

2.  c++ 함수인 cin,cout 등 사용해야 하고, 속도를 더 빠르게 하고 싶다면,

ios::sync_with_stdio(0)

cin.tie(NULL), cout.tie(NULL)

을 사용하되, c함수와 c++함수를 같이 사용하면 안된다. 

3. endl 보다는 '\n'을 사용하자