Mengapa Membaca Baris dari stdin Jauh Lebih Lambat dalam C berbanding Python?
Latar Belakang:
Membaca baris input rentetan daripada stdin menggunakan C boleh menjadi jauh lebih perlahan daripada setara Pythonnya. Percanggahan ini timbul disebabkan tetapan lalai dalam C yang memerlukan lebih banyak panggilan sistem.
Gelagat Lalai Strim Input:
Secara lalai, strim input C cin disegerakkan dengan perpustakaan C I/O standard (stdio). Penyegerakan ini memastikan bahawa input tidak ditimbal dan dibaca satu aksara pada satu masa. Walaupun tingkah laku ini menghalang percanggahan antara strim cin dan fungsi stdio, ia juga dikenakan penalti prestasi.
Penggunaan Panggilan Sistem:
Apabila cin disegerakkan dengan stdio, setiap aksara yang dibaca mencetuskan panggilan sistem, operasi yang mahal. Overhed ini melambatkan proses input dengan ketara, terutamanya apabila membaca sejumlah besar data.
Penyelesaian:
Untuk meningkatkan prestasi bacaan baris dalam C , seseorang boleh melumpuhkan penyegerakan antara cin dan stdio. Ini boleh dicapai dengan menggunakan kaedah sync_with_stdio(false).
Sebagai alternatif, menggunakan fungsi fgets dan bukannya getline juga memintas overhed penyegerakan.
Perbandingan Prestasi:
Berikut ialah perbandingan prestasi antara C asal (disegerakkan) pelaksanaan dan pelbagai pendekatan:
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 a fair comparison) | 54,644,808 |
Kesimpulan:
Melumpuhkan penyegerakan antara cin dan stdio atau menggunakan fgets boleh meningkatkan prestasi bacaan baris dalam C , menjadikan ia setanding dengan kecekapan Python.
Atas ialah kandungan terperinci Mengapa `cin` C 'cin' Jauh Lebih Lambat Daripada Python untuk Membaca Baris daripada stdin?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!