알고리즘을 공부하다 사람들이 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분 전
|
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 |
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 |
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 |
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 |
'Algorithm > 유용한 팁 (Tips)' 카테고리의 다른 글
vector, unordered_map 전체 순회 알고리즘 속도 비교 (2) | 2020.05.03 |
---|---|
[C++,구현] 백준 1764번 듣보잡 문제풀이, 배열,vector,map 속도비교 (0) | 2019.03.26 |
[C,C++] 지역변수와 전역변수 특징,백준 1463번 1로 만들기 풀이 (0) | 2019.03.11 |
[C,C++] 1,2차원 배열 원소 선언, 정적 동적 전체 초기화 (2) | 2018.08.23 |
댓글