본문으로 건너뛰기
Previous
Next
C++ I/O Optimization Cheatsheet | sync_with_stdio·cin.tie

C++ I/O Optimization Cheatsheet | sync_with_stdio·cin.tie

C++ I/O Optimization Cheatsheet | sync_with_stdio·cin.tie

이 글의 핵심

C++ I/O optimization for coding test TLE prevention. ios::sync_with_stdio(false)·cin.tie(nullptr) principles, getline vs cin, buffers, templates, benchmarks, interactive problem precautions.

Introduction

Coding test Time Limit Exceeded (TLE) is often caused by I/O overhead. C++‘s std::cin / std::cout are convenient, but default settings are synchronized with C standard I/O and cin is tied to cout, causing unnecessary frequent flushing.

What You Will Learn

  • Understand principles of ios::sync_with_stdio(false), cin.tie(nullptr)
  • Grasp differences between getline vs cin >>, endl vs \n
  • Learn copy-paste ready practical I/O templates
  • Check precautions for interactive problems

Reality in Production

When learning development, everything is clean and theoretical. But production is different. Wrestling with legacy code, chased by tight deadlines, facing unexpected bugs. The content covered here was initially learned as theory, but through applying it to real projects, I realized “ah, this is why it’s designed this way.” Particularly memorable is the trial and error from my first project. I did it by the book but couldn’t figure out why it didn’t work, spending days lost. Eventually, through senior developer code review, I found the problem and learned a lot in the process. This guide covers not just theory but pitfalls you may encounter in practice and their solutions.

Table of Contents

  1. Basic Optimization
  2. Practical Implementation
  3. Advanced Usage
  4. Performance Comparison
  5. Real-World Cases
  6. Troubleshooting
  7. Conclusion

Basic Optimization

Basic Two Lines

#include <iostream>
int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    
    // Use cin / cout afterward
    
    return 0;
}

sync_with_stdio(false)

Default (true): C++ iostream and C stdio are synchronized, allowing mixing but slow When false: Disable synchronization, use C++ streams only (fast) Warning: Do not mix printf and cout

cin.tie(nullptr)

Default: cin is tied to cout, auto flush before input When nullptr: No auto flush (fast) Warning: Interactive problems need explicit flush

Practical Implementation

1) iostream Template (Most Common)

#include <iostream>
#include <vector>
int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    
    int n;
    std::cin >> n;
    
    std::vector<int> v(n);
    for (int i = 0; i < n; ++i) {
        std::cin >> v[i];
    }
    
    // Output with '\n'
    for (int x : v) {
        std::cout << x << '\n';
    }
    
    return 0;
}

Tip: std::endl is newline + flush, so using it tens of thousands of times in a loop is slow

2) scanf / printf Template

#include <cstdio>
#include <vector>
int main() {
    int n;
    std::scanf("%d", &n);
    
    std::vector<int> v(n);
    for (int i = 0; i < n; ++i) {
        std::scanf("%d", &v[i]);
    }
    
    for (int x : v) {
        std::printf("%d\n", x);
    }
    
    return 0;
}

3) Fast Input (getchar-based)

#include <cctype>
#include <cstdio>
inline int readInt() {
    int c;
    do {
        c = getchar();
    } while (c != EOF && !isdigit(c) && c != '-');
    if (c == EOF) return 0;
    
    bool neg = (c == '-');
    if (neg) c = getchar();
    
    int x = 0;
    for (; isdigit(c); c = getchar()) {
        x = x * 10 + (c - '0');
    }
    
    return neg ? -x : x;
}
int main() {
    int n = readInt();
    
    for (int i = 0; i < n; ++i) {
        int x = readInt();
        // Process
    }
    
    return 0;
}

4) getline vs cin

cin >> (whitespace-separated)

int x;
std::string s;
std::cin >> x;  // Number
std::cin >> s;  // Until whitespace

getline (line-by-line)

std::string line;
std::getline(std::cin, line);  // Until newline

Caution When Mixing

int n;
std::cin >> n;
std::cin.ignore();  // Discard newline
std::string line;
std::getline(std::cin, line);

Advanced Usage

1) Buffer Size Optimization

#include <iostream>
int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    
    // Set buffer size (implementation-dependent)
    char buffer[1 << 20];  // 1MB
    std::cin.rdbuf()->pubsetbuf(buffer, sizeof(buffer));
    
    // Input
    
    return 0;
}

2) Fast Output

#include <iostream>
#include <vector>
void fastPrint(const std::vector<int>& v) {
    for (int x : v) {
        std::cout << x << '\n';
    }
    
    // Flush only once at end
    std::cout << std::flush;
}

3) Interactive Template

#include <iostream>
int main() {
    // Interactive: keep tie or explicit flush
    
    int query;
    std::cout << "Query: " << query << std::endl;  // Flush with endl
    
    int response;
    std::cin >> response;
    
    return 0;
}

Performance Comparison

sync_with_stdio Comparison

Test: 1 million integer input

MethodTimeSpeedup
Default (sync=true)800ms1x
sync=false320ms2.5x

cin.tie Comparison

Test: 1 million integer input/output

MethodTimeSpeedup
Default (tie=cout)500ms1x
tie=nullptr330ms1.5x

endl vs \n

Test: 1 million line output

MethodTimeSpeedup
endl1200ms1x
\n300ms4x

Troubleshooting

Problem 1: Mixing iostream and stdio

Symptom: Output order scrambled

// ❌ Mixed
std::ios::sync_with_stdio(false);
std::cout << "Hello" << std::endl;
printf("World\n");
// Output order not guaranteed
// ✅ Use only one
std::ios::sync_with_stdio(false);
std::cout << "Hello" << std::endl;
std::cout << "World" << std::endl;

Problem 2: endl Overuse

Symptom: Very slow output

// ❌ endl overuse
for (int i = 0; i < 1000000; ++i) {
    std::cout << i << std::endl;  // Flush every time
}
// ✅ Use \n
for (int i = 0; i < 1000000; ++i) {
    std::cout << i << '\n';
}
std::cout << std::flush;  // Once at end

Problem 3: Mixing getline and cin

Symptom: Reading empty line

int n;
std::cin >> n;
std::string line;
std::getline(std::cin, line);  // Empty line (newline character)
// ✅ Remove newline with ignore
std::cin >> n;
std::cin.ignore();
std::getline(std::cin, line);

Problem 4: Interactive Output Not Showing

Symptom: Output question but judge doesn’t respond

// ❌ No flush
std::cin.tie(nullptr);
std::cout << "? " << query;  // Stays in buffer
std::cin >> response;  // Judge doesn't see question
// ✅ Explicit flush
std::cout << "? " << query << std::endl;  // Flush with endl
std::cin >> response;

Conclusion

C++ I/O optimization is a key technique for preventing coding test TLE.

Key Summary

  1. sync_with_stdio(false)
    • Disconnect C stdio synchronization
    • 2.5x performance improvement
  2. cin.tie(nullptr)
    • Disconnect cin and cout
    • 1.5x performance improvement
  3. endl vs \n
    • endl includes flush
    • \n is 4x faster
  4. No Mixing
    • Use only iostream or stdio
    • Mixing doesn’t guarantee order

Optimization Checklist

ItemRecommendationEffect
sync_with_stdiofalse2.5x
cin.tienullptr1.5x
endlUse \n4x
MixingForbiddenStability
getlineHandle ignoreAccuracy

Code Example Cheatsheet

// Basic template
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
// Input
int n;
std::cin >> n;
// Output
std::cout << result << '\n';
// getline
std::cin.ignore();
std::getline(std::cin, line);
// Interactive
std::cout << query << std::endl;  // Flush with endl
std::cin >> response;

Benchmark Summary

Test: 1 million integer I/O

MethodTimeSpeedup
Default (sync=true, tie=cout)800ms1x
sync=false, tie=nullptr200ms4x
scanf/printf150ms5.3x
Conclusion: 4x improvement with optimization

Next Steps

References


자주 묻는 질문 (FAQ)

Q. 이 내용을 실무에서 언제 쓰나요?

A. C++ I/O optimization for coding test TLE prevention. ios::sync_with_stdio(false)·cin.tie(nullptr) principles, getline vs… 실무에서는 위 본문의 예제와 선택 가이드를 참고해 적용하면 됩니다.

Q. 선행으로 읽으면 좋은 글은?

A. 각 글 하단의 이전 글 또는 관련 글 링크를 따라가면 순서대로 배울 수 있습니다. C++ 시리즈 목차에서 전체 흐름을 확인할 수 있습니다.

Q. 더 깊이 공부하려면?

A. cppreference와 해당 라이브러리 공식 문서를 참고하세요. 글 말미의 참고 자료 링크도 활용하면 좋습니다.


같이 보면 좋은 글 (내부 링크)

이 주제와 연결되는 다른 글입니다.


이 글에서 다루는 키워드 (관련 검색어)

C++, I/O, TLE, BOJ, Codeforces, coding test, sync_with_stdio, cin.tie, iostream 등으로 검색하시면 이 글이 도움이 됩니다.