Rumah >pembangunan bahagian belakang >C++ >Adakah scanf() Sentiasa Mencapai Prestasi iostream dalam Kelajuan Input C?

Adakah scanf() Sentiasa Mencapai Prestasi iostream dalam Kelajuan Input C?

Patricia Arquette
Patricia Arquetteasal
2024-11-19 11:13:02377semak imbas

Does scanf() Always Outperform iostream in C   Input Speed?

Bolehkah scanf() mengatasi iostream dalam Prestasi C?

Tanggapan bahawa scanf() menyediakan pengendalian input yang lebih pantas daripada cin dalam C telah tercetus perdebatan di kalangan pengaturcara. Artikel ini menyelidiki perbandingan prestasi antara kaedah ini, memeriksa bukti dan memberikan penjelasan terperinci.

Ujian Prestasi

Untuk menilai perbezaan prestasi, program ringkas telah dicipta yang membaca senarai nombor daripada input standard dan melakukan operasi XOR pada mereka. Kedua-dua cin dan scanf() telah digunakan dalam pelaksanaan berasingan:

  • cin Versi:
#include <iostream>

int main() {
  int parity = 0;
  int x;

  while (std::cin >> x)
    parity ^= x;
  std::cout << parity << std::endl;

  return 0;
}
  • scanf Versi:
#include <stdio.h>

int main() {
  int parity = 0;
  int x;

  while (1 == scanf("%d", &x))
    parity ^= x;
  printf("%d\n", parity);

  return 0;
}

Keputusan

Menggunakan fail yang mengandungi lebih 33 juta nombor rawak, masa pelaksanaan diukur:

  • Versi cin: 24.3 saat
  • Versi imbasan: 6.4 saat

Pertimbangan Pengoptimuman

Menukar tetapan pengoptimuman pengkompil mempunyai kesan minimum pada hasil.

Prestasi iostream yang dipertingkatkan

Telah didapati bahawa jurang prestasi adalah sebahagiannya disebabkan oleh iostream mengekalkan penyegerakan dengan fungsi C I/O. Dengan melumpuhkan penyegerakan ini dengan arahan std::ios::sync_with_stdio(false), prestasi iostream meningkat dengan ketara:

#include <iostream>

int main() {
  int parity = 0;
  int x;

  std::ios::sync_with_stdio(false);

  while (std::cin >> x)
    parity ^= x;
  std::cout << parity << std::endl;

  return 0;
}

Hasil Baharu

Selepas melumpuhkan penyegerakan iostream :

  • Versi cin dengan Penyegerakan: 21.9 saat
  • Versi imbasan: 6.8 saat
  • Versi cin tanpa Penyegerakan: 5.5 saat

Kesimpulan

Buktinya menunjukkan bahawa scanf() memang lebih pantas daripada cin untuk pengendalian input mentah dalam C . Walau bagaimanapun, jika penyegerakan iostream dilumpuhkan, iostream menjadi pilihan unggul, mengatasi kedua-dua scanf() dan versi cin yang dioptimumkan.

Oleh itu, walaupun scanf() mungkin lebih pantas untuk senario tertentu, iostream menawarkan kawalan yang lebih baik ke atas penyegerakan dan rangkaian fungsi yang lebih luas. Apabila kelajuan adalah penting, melumpuhkan penyegerakan iostream disyorkan.

Atas ialah kandungan terperinci Adakah scanf() Sentiasa Mencapai Prestasi iostream dalam Kelajuan Input C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn