입출력 속도 늘리는 구문
입출력 속도를 높이는 법
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
이 세 줄은 내가 알고리즘 문제를 풀 때마다 작성하는 구문으로, 입출력 속도를 빠르게 하기 위해 사용하는 구문이다.
작동법
#include<iostream>
을 하면 c++에서 사용하는 함수 외에도 scanf와 같이 c에서 사용하는 기본적인 함수 역시 사용이 가능하다.
그렇지만, 저 세 줄을 입력한 뒤 c에서 사용하던 scanf_s
등을 사용하면 컴파일 에러가 뜨거나 원하는 값을 얻지 못하게 된다.
즉 저 세 줄은 c언어와의 연결을 끊어주는 역할을 한다는 것을 알 수 있다.
디테일한 설명
저 코드의 첫번째 줄은 stdio와 iostream버퍼의 연결을 끊어서 속도를 연결하는 방식이다.
평소 c++에서는 cin/cout
,scanf_s/printf
두개를 모두 사용 가능하다.
그렇기 때문에 별도의 버퍼를 가지게 되고 한 코드에서 저 두 방식을 섞어서 사용할 시 여러개의 버퍼가 생기게 된다.
즉 scanf_s/printf
와의 연결을 끊어 cin과 cout만 사용해야한다는 뜻이다.
cin.tie(0)
cin.tie(0),cin.tie(nullptr),cin.tie(null)이 세가지는 모두 같은 내용을 의미한다.
cin과 cout를 묶음으로 연결하지 않는다는 뜻으로 자동으로 버퍼를 비워준다.
유의점
위 세 줄의 함수를 사용하면 c언어와의 연결을 완전히 끊는다는 뜻은 아니다.
아주 특별한 이유가 있다면 c언어의 입출력 스타일도 성능을 고려하여 사용하는 것은 가능하다.
하지만, 기본적으로 저 세줄을 작성하는 이유가 c와 c++의 입출력함수를 혼용하였을 때 생기는 성능 문제를 최소화하기 위한 것이므로 c++ 스타일의 입출력 함수
를 사용하는 것이 좋다.
endle의 사용 금지
endle과 ` \n`의 가장 큰 차이는 출력을 할 때 버퍼를 지우느냐 마느냐이다.
endle은 출력 시 버퍼를 지우는 과정까지 포함하기 때문에 좀 더 무거운 동작을 한다.
따라서 알고리즘 문제를 풀 때 속도 문제로 저 세 줄을 썼을 때에는 endle을 사용하지 않는 것을 권장한다.
버퍼란
키보드로 입력한 내용은 버퍼라는 임시 저장소를 거쳐 표준 입력 스트림으로 변환된 뒤 cpu로 전송된다.
버퍼를 사용하지 않고 바로 표준 입력 스트림으로 전송을 하면 입력장치의 데이터 처리 수행 능력이 초당 1회밖에 되지 않으므로 프로그램의 처리속도가 늦어진다.
따라서 버퍼는 속도의 차이나 양의 불일치를 조절함으로써 프로그램의 처리 속도 증가에 도움을 준다.
댓글남기기