코딩기술

입출력 속도 / 컴파일러 향상시키기

HongongHB 2023. 9. 3. 03:47

지금까지 나는 C 의 입출력 형태인 printf() 와 scanf() 를 사용했었다. 근데 이것보다 C++의 cin, cout 으로 더 빠르게 입/출력을 할 수 있다는 것을 알게 되었다.

 

위와 같은 형태로는 printf와 scanf가 더 빠르다. 그러나 아래 코드를 추가하면 cin, cout이 더 빨라진다.

ios_base::sync_wihe_stdio(false);
cin.tie(NULL);

이는 C 의 입출력 형태인 printf() 와 scanf()C++의 cin, cout 의 버퍼 동기화를 false 하겠다는 의미이다.

즉 입출력시에 둘 중에 C++의 cin, cout만 사용하겠다는 의미이다.

 

cin.tie(null); 코드는 cin과 cout의 묶음을 풀어준다.

기본적으로 cin과 cout은 묶여있고 묶여있는 스트림들은 한 스트림이 다른 스트림에서 각 IO 작업을 진행하기 전에 자동으로 버퍼를 비워주어야한다.

 

아래의 코드로 예시를 들어보자.

cout << "이름을 입력하세요: ";
cin >> name;

 

위 경우 cin과 cout이 묶여있기 때문에, 이름을 입력하기 전에 "이름을 입력하세요: " 구문이 먼저 출력될 것이다.

하지만, cin.tie(null); 코드를 추가한다면 cin과 cout의 묶음이 풀리면서 "이름을 입력하세요: "; 구문이 먼저 출력되지도 않았는데 먼저 이름을 입력을 받는 경우가 발생할 수 있다.

이는 cout이 기본적으로 버퍼에 추가되고 바로 비워지지 않기 때문입니다. (출력 명령을 내리거나 버퍼가 가득 찼을 경우에만 버퍼를 비우고 출력한다.)

따라서, cin.tie(null); 코드를 추가했고 name을 입력받기 전에 "이름을 입력하세요: " 구문을 먼저 보고 싶다면 cout으로 "이름을 입력하세요: "를 출력할 때 버퍼를 비워줘야한다.

 

추가로 출력시에 아래 코드까지 추가하면 더 빨라진다.

cout << i << "\n";