[C++] 입출력 속도 향상

JH Bang·2022년 12월 15일
0

C/C++

목록 보기
7/8
post-thumbnail

cin과 cout과 관련된 입출력이 많은 경우 C++의 실행 속도를 좀더 빠르게 하는 방법이 있다.
cin.tie(NULL)과 ios_base::sync_with_stdio(false)를 적용해 주고, std::endl 대신 '\n'을 사용하는 것이다.

/* 적용 예시 */

#include <iostream>

int main(void)
{

int main()
{
	std::ios::sync_with_stdio(false); std::cin.tie(NULL); std::cout.tie(NULL);
    
    int input;
    std::cout << "input : \n";
    std::cin >> input;
    
    [...]
    
    return (0);
}

std::ios::sync_with_stdio(false)

std::ios::sync_with_stdio(true)는 stdio (C)와 iostream (C++)을 둘 다 사용하기 위해 동기화한다.
따라서 false를 적용하면 C와 C++ 사이의 버퍼 동기화를 비활성화 시켜준다. C버퍼를 안 쓰게 되므로 실행속도가 빨라진다.

std::cin.tie(NULL), std::cout.tie(NULL)

cin과 cin 버퍼를 묶지 않는다는 것인데, 버퍼가 묶여있다는 것은 std::cin이 실행될 때마다 std::cout 버퍼를 비운다는 것이다.

tie(NULL)을 적용해주면 std::cin을 다 받은 뒤 버퍼가 비워지는 등 정의되지 않은 동작이 발생하게 된다. 즉, 어떤 시스템에서는 순서대로 나오고, 다른 시스템에서는 cin을 받은 뒤 cout을 출력해주는 경우가 생긴다.

따라서 수동으로 cout 버퍼를 비워줘야 한다.

하지만 std::endl 을 사용하게 되면 출력버퍼를 비우게 되므로 입력과 출력이 순서대로 이뤄진다.

코딩테스트의 경우 출력결과 값만 확인하기 때문에 입력과 출력 순서가 꼬여도 상관 없다.

std::endl 과 '\n'

std::endl의 경우 개행 문자 출력을 하면서 출력 버퍼를 비워준다. 더 빠르게 하고 싶다면 '\n'만 사용한다.

버퍼비우기

std::flush

os.flush()를 호출해 출력버퍼를 비우는 방법이다. 다음과 같이 사용한다.

std::cout << std::flush

std::cin.ingnore()

사실 ignore는 말 그대로 무시하고 들어가는 동작이기 때문에 실제 비워주는 것과는 다르다. 다만 버퍼를 비워준것 같은 효과가 있다.

profile
의지와 행동

0개의 댓글