Penalti Prestasi Membaca baris dari stdin dalam C Berbanding Python
Seseorang mungkin terkejut apabila mendapati bahawa membaca baris teks daripada stdin dalam C adalah jauh lebih perlahan daripada operasi yang setara dalam Python. Untuk menangani perbezaan prestasi ini, mari kita teliti sebab ia berlaku dan sediakan penyelesaian untuk mengurangkannya.
Tetapan Lalai dalam C
Secara lalai, strim cin C ialah disegerakkan dengan input dan output standard (stdio), mengakibatkan penimbalan input dilumpuhkan. Ini bermakna cin melaksanakan satu aksara dibaca pada satu masa, menghasilkan banyak panggilan sistem, yang merupakan kesesakan prestasi.
Pengendalian Input Dioptimumkan Python
Sebaliknya, Python menggunakan mekanisme pengendalian input yang dioptimumkan yang menampan input dalam ketulan, mengurangkan panggilan sistem dan menambah baik prestasi.
Meningkatkan Prestasi Bacaan C
Untuk meningkatkan prestasi bacaan C , dua pendekatan boleh diguna pakai:
Lumpuhkan Penyegerakan cin dengan stdio:
std::cin.sync_with_stdio(false);
Gunakan fgets Sebaliknya:
char buffer[1024]; while (fgets(buffer, sizeof(buffer), stdin)) { // process line }
Perbandingan Pendekatan
Jadual berikut membandingkan prestasi pelbagai pelaksanaan:
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 |
Seperti yang terbukti, melumpuhkan penyegerakan cin atau menggunakan fgets dengan ketara meningkatkan prestasi C , menjadikannya setanding dengan Python dari segi bacaan baris daripada stdin.
Atas ialah kandungan terperinci Mengapa Membaca Baris dari stdin Lebih Lambat dalam C berbanding Python, dan Bagaimana Ia Boleh Diperbaiki?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!