C++

[C++]입출력 속도 개선, 언어별 속도차이

언어별 입출력 속도차이를 알아보고, 속도 개선할 수 있는 방법을 알아봅시다.

Posted by kyoungIn on December 20, 2018

C++ 입출력 속도 차이

언어 입력방식 수행시간(초)
C/C++ scanf 0.798
C/C++ getchar(*) 0.390
C++ std::cin 2.051
C++ std::ios::sync_with_stdio(false) + std::cin 0.796
java java.util.Scanner 6.068
java java.io.BufferedReader(*) 0.934
golang fmt.Scan 44.557
golang bufio.Reader + fmt.Fscan 9.899
golang bufio.Scanner(*) 1.299

(*): 문자(열) -> 정수 변환 필요


cin,cout 보다 scanf,printf 가 컴파일속도가 훨씬 빠르기 때문에 scanf, printf를 쓰는 것을 권장하지만 cin, cout 을 굳이 쓰고 싶다면 코드에서 ios::sync_with_stdio(false) 를 선언해주면 속도가 얼추 비슷해지는 것을 알 수 있다.

cin, cout 의 성능을 높히는 방법을 소개하겠다.

1. ios::sync_with_stdio(false)

ios::sync_with_stdio cpp의 iostream을 c의 stdio와 동기화시켜주는 역할을 합니다. 이는 iostream, stdio의 버퍼를 모두 사용하기 때문에 딜레이가 발생하게 됩니다. ios::sync_with_stdio(false)는 이 동기화 부분을 끊는 함수입니다. 이를 사용하면 c++만의 독립적인 버퍼를 생성하게 되고 c의 버퍼들과는 병행하여 사용할 수 없게 됩니다. 대신 사용하는 버퍼의 수가 줄어들었기 때문에 속도는 높아지게 됩니다.

2.cin.tie(NULL);cout.tie(NULL);

디폴트는 cout,cin이 tie되어 있습니다.이것을 풀어줍니다.

3.std::endl 대신에 “\n” 사용하기

endl는 개행만 해주는 것이아니라 개행 + 출력버퍼를 비워야 하기때문에 느립니다.