본문 바로가기

C++

C++ cout,cin 을 빠르게

BAEKJOON ONLINE JUDGE를 꾸준히 해오고 있습니다.

 

https://www.acmicpc.net

 

올해는 드디어 랭킹 1000위 안으로 진입해 의욕도 더욱 증가했습니다만

쉬운 문제들은 거의 다 풀어서 매일 한문제의 목표도 더욱 어려워져만 갑니다.

 

문제의 난이도=처리속도 의 경우가 꽤 많아서 c++의 cout,cin를 사용하지 않고 c의printf,scanf를 사용해서 어렵게 패스하고 했는데 좋은 방법이 있었네요.

 

 

1. ios::sync_with_stdio(false); 그리고 줄바꿈을 endl이 아닌 '\n'으로처리

입출력 시 c++의 iostream과 c의 stdio의 양쪽 버퍼를 모두 사용(cin,cout, scanf, printf를 혼재해서 사용) 하도록 되어있고 작동에 문제가 없도록 동기화 처리가 필요한데 cin,cout, scanf, printf를 혼재해서 사용하지 않는다면 특별히 동기화 처리가 필요하지 않기에 이것을 꺼줌으로써 성능의 향상을 얻을 수 있다고 합니다.

//기본    
for (int i = 0; i < 10; i++)
{
    cout << '1';
    printf("2");
}

>> 12121212121212121212

// ios::sync_with_stdio(false);

ios::sync_with_stdio(false);
for (int i = 0; i < 10; i++)
{
    cout << '1';
    printf("2");
}

>> 22222222221111111111

 

endl은 단순히 개행처리만 하는것이 아니라 버퍼를 비우는 처리도 합니다. 당연히 성능에 영향을 미칩니다.

 

 

2. cin.tie(NULL)

"~을 입력해주세요" 라는 프롬프트를 출력하고 입력을 받는 상호작용을 위해 기본적으로 cin과 cout가 연결되어있는데 역시 이를 끊어줌으로서 성능의 향상이 있습니다.

그런데 테스트를 해보니 이 자체만으로는 작동을 안하고 ios_base::sync_with_stdio(false); 의 상태에서 작동했습니다.

//기본
#include <iostream>
using namespace std;
int main(void)
{
	int n;
	cout << "Enter number: ";
	cin >> n;
	cout << n << endl;

    return 0;
}

>>Enter number: 가 표시되고 숫자를 입력하고 엔터를 입력하면 숫자가 출력됨

//cin.tie(NULL);
#include <iostream>
using namespace std;
int main(void)
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	int n;
	cout << "Enter number: ";
	cin >> n;
	cout << n << endl;

    return 0;
}

>>아무 출력이 없고 숫자를 입력하고 엔터를 입력하면 그때서야 Enter number: 와 입력한 숫자가 같이 출력됨

 

더 조사할 것

1.ios::sync_with_stdio(false); 와 ios_base::sync_with_stdio(false); 의 차이점

2.cout.tie(NULL)

반응형