[C++]Tips
C++ code를 보다보면 아래와 같은 코드뭉치를 발견할 때가 있다.
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
대단한 건 아니고(아니 대단하다) 속도를 빨라지게 해준다. 표준 C++에선 C언어의 printf(), scanf()와 달리 std::cout 과 std::cin 클래스를 이용한다. C언어에 비해 속도가 느려지는 결과를 가져오기 때문에 속도를 보다 빠르게 하기 위한 코드 뭉치라고 생각하면 된다.
C언어의 fwrite을 제외하면 해당 방식보다 빠른 건 없다. C언어에서 평상 많이 쓰이는 printf()보다 빠르다.
백준에서 출력 속도를 비교한 게시글 링크
출력 속도 비교
여러가지 언어와 출력 방법을 이용해서 시간이 얼마나 걸리는지 비교해 보았습니다. 방법: 총 N개의 줄에 1부터 10,000,000까지의 자연수를 한 줄에 하나씩 출력하는 시간을 측정. 10번 측정해서 평
www.acmicpc.net
C언어의 mmap과 fread, getchar을 제외하면 해당 방식보다 빠른 건 없다. C언어에서 평상 많이 쓰이는 scanf()보다 빠르다.
백준에서 입력 속도를 비교한 게시글 링크
입력 속도 비교
여러가지 언어와 입력 방법을 이용해서 시간이 얼마나 걸리는지 비교해 보았습니다. 방법: 첫째 줄에 정수의 개수 N (= 10,000,000), 둘째 줄부터 N개의 줄에 한 개의 자연수(10,000 이하)가 적힌 파일
www.acmicpc.net
ios::sync_with_stdio(0);
이 코드는 기본적으로 C언어의 표준 스트림과 C++의 표준 스트림의 동기화를 끊는다. 동기화를 끊게 되면 사용 버퍼가 줄기 때문에 실행속도가 비약적으로 상승한다.
cin.tie(0);
cout.tie(0);
이 코드는 cin을 cout에서 untie시킨다.(tie(false)가 그런 의미.) 따라서 stream을 flush하지 않아도 되기에 실행속도가 빨라진다.
*추가로, std::endl 보다 '\n'의 개행문자 사용을 권장한다. 속도가 더 빠르다. (왜냐하면 std::endl는 출력버퍼를 비우는 fflush함수로 동작하기 때문이다. 이 때, 출력버퍼를 지운다는 말은 출력버퍼에 저장된 데이터를 지우는 것이 아니라 출력버퍼에 저장된 데이터를 목적지로 최종 전송하는 것이다. 따라서 더 오래 걸린다.)
* printf(),scanf()함수와 cout,cin을 동시에 사용할 수 없다.