본문 바로가기
Algorithm/유용한 팁 (Tips)

[C++] 입출력 속도 가속시키기 백준 2741번 N찍기 풀이 std::ios_base::sync_with_stdio(0)

by matters_ 2018. 8. 6.

 

알고리즘을 공부하다 사람들이 std::ios_base::sync_with_stdio(0);를 간간히 사용하는 것을 보았다. 

 

왜 그런지 궁금하여 찾아보니

 

C++에서 흔하게 사용되는 입력 방법은 cin인데 이 cin이 다른 입력방법 (scanf, get)에 비해 상대적으로 느리다는 것이다.

 

알고스팟에 올라온 자료를 첨부한다.

 

 

 

 

출처 : https://algospot.com/forum/read/2496/

 

위의 자료에 따르면 std::cin은 scanf보다 거의 3배가까이 느린것으로 나온다.

 

이유는 cpp의 iostream의 buffer와 c의 stdio buffer와 동기화 시켜주므로 2개의 버퍼사용으로 속도가 저하된다는 것이다.

 

하지만 std::ios_base::sync_with_stdio(false);를 사용하므로서 동기화를 끊으면 c++만의 독립적인 버퍼를 생성하게 되

 

고 c의 버퍼들과는 병행하여 사용할 수 없게 된다. 대신 속도는 높아지는 원리이다.

 

여기서 주의점이 있다. std::ios_base::sync_with_stdio(false);를 사용한다 하더라도 std::cout<<std::endl;를 사용하는 경우이다.

 

std::cout << "\n"; 과 std::cout << std::endl은 20배 이상으로 속도차이가 난다고 한다. 

 

즉, 코드에 std::endl;를 남발해버리면 std::ios_base::sync_with_stdio(false);를 사용한 효과가 미미해 질 수 있다.

 

결론!  C++에서 수행시간을 줄이려면 std::ios_base::sync_with_stdio(false);와 std::cout << "\n"를 사용하자.

 

 

덧붙여서 백준의 2741번 문제를 시험삼아 코드를 달리하며 시간을 제어보았다.

 
9374046 shj1504 2741 맞았습니다!! 1984 KB 8 ms C++14 수정 217 B 2분 전
9374030 shj1504 2741 시간 초과     C++14 수정 203 B 3분 전
9374020 shj1504 2741 맞았습니다!! 1984 KB 8 ms C++14 수정 203 B 4분 전
9373971 shj1504 2741 맞았습니다!! 1984 KB 12 ms C++14 수정 164 B 8분 전

 

제일 위 결과값부터 제출한 코드를 보자면 
 
채점번호 9374046
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
using namespace std;
 
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    int num;
    cin>>num;
    for(int i=1;i<=num;i++){
        cout<<i<<'\n';
    }
    return 0;
}
cs
 
 
채점번호 9374030
 
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
using namespace std;
 
int main(){
    ios_base::sync_with_stdio(false);
    int num;
    cin>>num;
    for(int i=1;i<=num;i++){
        cout<<i<<endl;
    }
    return 0;
}
cs
 
 
채점번호 9374020
 
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
using namespace std;
 
int main(){
    ios_base::sync_with_stdio(false);
    int num;
    cin>>num;
    for(int i=1;i<=num;i++){
        cout<<i<<'\n';
    }
    return 0;
}
cs
 
 
 
채점번호 9373971
 
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
using namespace std;
 
int main(){
    int num;
    cin>>num;
    for(int i=1;i<=num;i++){
        cout<<i<<'\n';
    }
    return 0;
}
cs
 
이러한 간단한 코드도 시간차이가 나는데 입력값이 엄청난 복잡한 문제 같은 경우 차이는 어마할 것으로 생각된다.
 

 

 

 

 

 

댓글