概要
C++とPythonで標準入力(stdin)からのデータを読み取る際、処理速度に大きな違いが見られることがあります。特に大量のデータを読み込む際、C++の標準的なcinはPythonのsys.stdinよりも圧倒的に遅いです。しかし、これはC++が標準入出力との同期処理をデフォルトで行っているためであり、適切に設定を変更すればC++も同等以上の速度を出すことが可能です。
C++の標準入力処理の問題点
C++でcinを使用してデータを読み込む場合、cinは標準的にstdioとの同期が有効になっており、これが速度低下の原因となります。標準入出力と同期することで、cinとstdioが同時に使われた場合にデータの不整合が生じないようにしていますが、この同期処理が非常に多くのシステムコールを発生させるため、特に大規模データの入力時に大きな負荷をかけます。
Pythonのsys.stdinの動作
一方で、Pythonのsys.stdinはデフォルトでバッファリング処理を行っているため、データの読み込みが効率的です。Pythonは標準入力の処理が非常に高速であり、同様の条件でC++と比較した場合、通常はPythonが圧倒的に優れたパフォーマンスを示します。
sync_with_stdio(false)の使用によるC++の高速化
C++の標準入力処理を高速化するためには、sync_with_stdio(false)を使用して標準入出力の同期を解除することが効果的です。これにより、cinは独立してバッファリングを行うようになり、標準入力からの読み込み速度が飛躍的に向上します。
例: sync_with_stdio(false)の使用
#include <iostream>
int main() {
std::ios::sync_with_stdio(false); // 標準入出力との同期を無効化
std::string line;
while (std::getline(std::cin, line)) {
// 行の処理
}
return 0;
}
このコードにより、cinの同期処理が解除され、より効率的に標準入力を読み取ることができます。また、さらなる高速化のためには、入力バッファを手動で設定することも有効です。
実際のベンチマーク結果
実際のベンチマークでは、PythonとC++で同じデータを読み込んだ場合、同期を解除していないC++は9秒かかるのに対し、Pythonは1秒で処理を完了しました。しかし、sync_with_stdio(false)を使ったC++コードは、Pythonと同等の1秒まで速度を向上させることができました。
まとめ
C++の標準入力処理はデフォルトでは同期処理が原因で遅くなりますが、sync_with_stdio(false)を使用することでこの問題を解消し、Pythonと同等の高速なデータ処理が可能になります。大量のデータを扱う場面では、このテクニックが非常に有効です。