Mengapakah membaca baris daripada stdin jauh lebih perlahan dalam C berbanding Python?
Membaca baris daripada input standard (stdin) boleh menjadi lebih perlahan dalam C berbanding Python disebabkan tetapan lalai yang berbeza dalam aliran input C.
Lalai Penimbalan
Secara lalai, strim input C (cin) disegerakkan dengan strim input/output (stdio) standard. Penyegerakan ini memaksa cin untuk mengelakkan sebarang penimbalan input, menghasilkan bacaan satu aksara pada satu masa.
Penimbalan Python
Sebaliknya, aliran stdin dalam Python ditimbal secara lalai, yang membolehkannya membaca sebahagian besar input sekaligus. Ini mengurangkan bilangan panggilan sistem yang diperlukan untuk membaca data, membawa kepada prestasi yang lebih baik.
Membetulkan Kod C
Untuk mencapai prestasi yang serupa dalam C , anda boleh melumpuhkan penyegerakan dengan stdio dengan menambah baris berikut pada permulaan fungsi utama anda:
std::ios_base::sync_with_stdio(false);
Ini membolehkan cin menimbal inputnya dan meningkatkan kelajuan bacaan dengan ketara.
fgets vs. getline
Selain itu, anda boleh mempertimbangkan untuk menggunakan fgets dan bukannya getline(), iaitu fungsi C yang membaca baris teks daripada fail atau input standard. fgets mempunyai kelebihan kerana tidak memerlukan peruntukan memori dinamik, meningkatkan lagi prestasi.
Perbandingan Prestasi
Di bawah ialah jadual membandingkan garisan sesaat (LPS) untuk pendekatan yang berbeza menggunakan fail baris 100M:
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 anda lihat, melumpuhkan penyegerakan atau menggunakan fgets meningkatkan prestasi C .
dengan ketaraAtas ialah kandungan terperinci Mengapakah Input stdin C Jauh Lebih Lambat Daripada Python, dan Bagaimana Ia Boleh Diperbaiki?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!