[CS] I/O 속도 개선을 위한 ios_base::sync_with_stdio(false), cin.tie(NULL), '\n'

2023. 8. 15. 15:15·CS

백준에서 간단한 stack 문제를 푸는 도중 발생한 시간 초과 문제입니다. 모든 테스트케이스를 고려했었고, 100% 확신을 한 상태에서 제출을 했는데 다음과 같은 issue가 발생했습니다.

설마설마하고 ios_base::sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL) 코드를 넣었는데 정답 처리가 되었습니다.

그래서 이러한 사례가 많았는데, 막연하게 시간초과 방지를 위해 코드를 달아주는 것 외에는 정확히 모르고 있었습니다. 그래서 이 코드들에 대해 무엇이고 어떠한 상황에 사용하는지 알아보려고 합니다.

 

  •  ios_base::sync_with_stdio(false): C/C++ 표준 스트림 간 동기화 비활성화 처리
    • 장점
      • 일반적으로 C++ 표준 스트림(cin + cout)은 C 표준 스트림(stdin + stdout)과 동기화가 됩니다. 그래서 동기화 옵션을 false로 설정해 주면 C++ 스트림이 자체적으로 독립적인 버퍼를 가질 수 있어 입/출력 속도를 향상할 수 있습니다.
      • 더불어 동기화된 C++ 버퍼는 thread-safe이기 때문에, 입/출력 결과를 보장할 수 있게 됩니다. 
    •  주의사항
      • single-thread 환경에서만 위의 성능들을 보장할 수 있습니다. 
      • C의 스트림을 비활성화 해주었기에 scanf/printf/puts/getchar/putchar(C의 입/출력 방식)를 사용해서는 안됩니다.
  • cin.tie(NULL)
    • 다른 스트림의 I/O 작업 전에 한 스트림이 자동으로 플러시(버퍼를 비우는 작업) 되도록 합니다(모든 출력이 표시됨)
    • cin/cout은 입력을 기다리기 전에 출력이 표시되도록 하는 데 유용할 수 있지만, 경우에 따라 성능 향상을 위해 자동 플러시를 비활성화해야 할 필요가 있습니다. 
    • 즉, 입력에 대한 출력을 한꺼번에 보고 싶을때 cin.tie(NULL)(자동 플러시 비활성화)를 걸어주면 됩니다. 
    • 하지만, 입출력의 순서를 보장받을 수 없게 됩니다. 
  • cout.tie(NULL)
    • cout 스트림도 마찬가지로 cin 스트림에 연결됩니다. 
    • cin을 이용하여 출력 작업을 수행하면 출력 작업이 발생하기 전에 존재했던 cin 스트림이 플러시 됩니다.
    • 이 옵션을 사용하게 되면 이러한 cin 스트림의 자동 플러시를 비활성화하게 됩니다.
  • endl -> '\n'
    • endl은 개행뿐만 아니라, 출력 버퍼까지 플러시 해줍니다. 
    • 매번 endl을 사용하게 되면 불필요하게 출력 버퍼를 비우게 되어 성능 저하가 발생합니다. 
    • 그래서 출력 버퍼를 명시적으로 비워줘야 하는 특별한 상황이 아니라면, 출력 버퍼까지 플러시 해주는 endl 대신 '\n'를 사용해야 합니다.

<참고자료>

https://stackoverflow.com/questions/31162367/significance-of-ios-basesync-with-stdiofalse-cin-tienull

 

Significance of ios_base::sync_with_stdio(false); cin.tie(NULL);

What is the significance of including ios_base::sync_with_stdio(false); cin.tie(NULL); in C++ programs? In my tests, it speeds up the execution time, but is there a test case I should be worried...

stackoverflow.com

  https://velog.io/@gogori6565/BOJ-cin.tieNULL%EA%B3%BC-iosbasesyncwithstdiofalse

 

[BOJ/C++] cin.tie(NULL)과 ios_base::sync_with_stdio(false) 그리고 endl...

알고리즘 문제 풀면서 시간을 줄이는 방법들

velog.io

 

저작자표시 비영리 변경금지 (새창열림)

'CS' 카테고리의 다른 글

[Architecture] MSA (vs MA)  (1) 2024.10.22
[CS] HTTP, HTTPS의 개념과 차이점에 대해 알아보자  (0) 2023.12.01
[CS] 면접을 위한 CS 전공지식 노트 정리(chapter4 데이터베이스)  (1) 2023.06.05
[컴퓨터 구조] chapter3 정리(컴퓨터 연산 : 부동소수점)  (0) 2023.05.28
[컴퓨터 구조] chapter3 정리 (컴퓨터 연산 : 덧셈, 뺄셈, 곱셈, 나눗셈)  (0) 2023.05.22
'CS' 카테고리의 다른 글
  • [Architecture] MSA (vs MA)
  • [CS] HTTP, HTTPS의 개념과 차이점에 대해 알아보자
  • [CS] 면접을 위한 CS 전공지식 노트 정리(chapter4 데이터베이스)
  • [컴퓨터 구조] chapter3 정리(컴퓨터 연산 : 부동소수점)
SeungbeomKim
SeungbeomKim
[IT(PS, CS, SW, etc.) 지식 기록] Github : https://github.com/daily1313/
  • SeungbeomKim
    개발 블로그
    SeungbeomKim
  • 전체
    오늘
    어제
    • 분류 전체보기 (383)
      • 일상 (33)
        • 여행 (17)
        • 회고록 (9)
        • 리뷰 (7)
      • PS (138)
        • 그리디 알고리즘[Greedy] (25)
        • 정렬 알고리즘[Sort] (18)
        • 문자열 알고리즘[String] (14)
        • 동적 계획 알고리즘[DP] (17)
        • 깊이 우선 탐색, 너비 우선 탐색[DFS, BFS.. (34)
        • 재귀[Recursion] (2)
        • 백트래킹[Backtracking] (5)
        • 브루트포스 알고리즘[Bruteforce] (16)
        • 자료 구조[Data Structure] (4)
        • 분할 정복 알고리즘[Divide & Conquer.. (3)
      • CS (22)
      • Network (11)
      • Database (8)
        • Elasticsearch (3)
      • Linux (2)
      • JavaScript (4)
        • AngularJS (1)
      • Java (92)
        • Effective Java (5)
        • Java Concept (20)
        • Spring (61)
        • Design Pattern (3)
      • Python (2)
      • Vscode (1)
      • DevOps (43)
        • AWS (27)
        • Git (7)
        • Docker (6)
        • Nginx (1)
      • 자격증 (10)
        • SQL (4)
      • 사이드 프로젝트 (2)
        • MatJido (2)
      • 기타 (9)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 소개
  • 링크

    • Github
  • 공지사항

  • 인기 글

  • 태그

    정보처리기사 실기
    컴퓨터구조
    Effective Java
    BFS
    이펙티브 자바
    너비 우선 탐색
    메타코딩
    다이나믹 프로그래밍
    dfs
    정보처리기사 필기
    백트래킹
    정보처리기사
    dp
    일본여행
    docker
    Wi-Fi
    springboot
    Spring
    AWS
    sqld
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
SeungbeomKim
[CS] I/O 속도 개선을 위한 ios_base::sync_with_stdio(false), cin.tie(NULL), '\n'
상단으로

티스토리툴바