Rumah >pembangunan bahagian belakang >C++ >Adakah `scanf()` dalam C Benar-benar Lebih Cepat Daripada `cin` untuk Input?
Menggunakan scanf() dalam C : Adakah Ia Lebih Cepat Daripada cin?
Dalam C , dipercayai secara meluas bahawa menggunakan cin dan cout untuk input dan output adalah lebih perlahan daripada menggunakan printf dan scanf. Ini berpunca daripada andaian bahawa scanf() dioptimumkan untuk C, manakala cin dan cout dilaksanakan menggunakan fungsi I/O standard yang lebih perlahan.
Hasil Penanda Aras
Untuk menentukan sama ada tuntutan ini berlaku, penanda aras mudah telah dijalankan melibatkan program yang membaca senarai nombor daripada input standard dan mengira XOR mereka. Program ini dilaksanakan menggunakan kedua-dua versi iostream dan scanf:
Versi iostream:
#include <iostream> int main() { int parity = 0; int x; while (std::cin >> x) parity ^= x; std::cout << parity << std::endl; return 0; }
Versi scanf:
#include <stdio.h> int main() { int parity = 0; int x; while (1 == scanf("%d", &x)) parity ^= x; printf("%d\n", parity); return 0; }
Apabila diuji dengan set data besar melebihi 33 juta nombor rawak, versi scanf selesai dalam 6.4 saat, manakala versi iostream mengambil masa 24.3 saat yang mengecewakan.
Impak Pengoptimuman
Tetapan pengoptimuman pengkompil tidak menjejaskan keputusan dengan ketara. Ini menunjukkan bahawa perbezaan kelajuan adalah terutamanya disebabkan oleh perbezaan yang wujud dalam pelaksanaan scanf() dan cin/cout.
The Culprit: std::ios::sync_with_stdio
Siasatan lanjut mendedahkan bahawa fungsi I/O iostream mengekalkan penyegerakan dengan fungsi C I/O. Secara lalai, penyegerakan ini melibatkan pemadaman penimbal output selepas setiap operasi input, menghasilkan prestasi yang lebih perlahan.
Melumpuhkan Penyegerakan
Nasib baik, penyegerakan ini boleh dilumpuhkan dengan membuat panggilan std::ios::sync_with_stdio(false):
std::ios::sync_with_stdio(false);
Selepas melumpuhkan penyegerakan, prestasi versi iostream bertambah baik secara mendadak, selesai dalam masa 5.5 saat sahaja.
C iostream Menang
Dengan penyegerakan dilumpuhkan, C iostream menjadi pilihan yang lebih pantas untuk penanda aras khusus ini. Ternyata penyegerakan dalaman std::cout adalah punca utama prestasi iostream yang lebih perlahan.
Kesimpulan
Walaupun menggunakan scanf() boleh menjadi lebih pantas dalam beberapa kes, melumpuhkan std::ios::sync_with_stdio membolehkan iostream mengatasi prestasi scanf dalam banyak senario, terutamanya apabila mengelakkan penggunaan bercampur fungsi stdio dan iostream.
Atas ialah kandungan terperinci Adakah `scanf()` dalam C Benar-benar Lebih Cepat Daripada `cin` untuk Input?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!