Performance Penalty of Reading lines from stdin in C Compared to Python
One might be surprised to discover that reading lines of text from stdin in C is significantly slower than the equivalent operation in Python. To address this performance disparity, let's delve into why it occurs and provide solutions to mitigate it.
Default Settings in C
By default, C 's cin stream is synchronized with standard input and output (stdio), resulting in disabled input buffering. This means that cin performs one character read at a time, resulting in numerous system calls, which is a performance bottleneck.
Python's Optimized Input Handling
In contrast, Python employs optimized input handling mechanisms that buffer input in chunks, reducing system calls and improving performance.
Improving C Read Performance
To enhance the reading performance of C , two approaches can be adopted:
Disable cin's Synchronization with stdio:
std::cin.sync_with_stdio(false);
Utilize fgets Instead:
char buffer[1024]; while (fgets(buffer, sizeof(buffer), stdin)) { // process line }
Comparison of Approaches
The following table compares the performance of various implementations:
Implementation | Lines per Second |
---|---|
Python (default) | 3,571,428 |
cin (default/naive) | 819,672 |
cin (no sync) | 12,500,000 |
fgets | 14,285,714 |
wc (not fair comparison) | 54,644,808 |
As evident, disabling cin synchronization or using fgets significantly improves the performance of C , making it comparable to Python in terms of reading lines from stdin.
The above is the detailed content of Why is Reading Lines from stdin Slower in C than in Python, and How Can It Be Improved?. For more information, please follow other related articles on the PHP Chinese website!