Rumah > Artikel > pembangunan bahagian belakang > Adakah C IOStreams Sentiasa Lambat Daripada printf/scanf?
Strategi untuk Meningkatkan Prestasi IOStream
Kebanyakan pengaturcara C lebih suka fungsi printf/scanf apabila mengekod dalam C , memetik antara muka unggul mereka. Walau bagaimanapun, IOStreams sering menghadapi kebimbangan prestasi.
Pengoptimuman Penimbalan
Meningkatkan saiz penimbal meningkatkan prestasi dengan mengurangkan hit HDD dan panggilan sistem. Ini boleh dicapai dengan mengakses streambuf asas dan mengubah suai penimbalnya:
char Buffer[N]; std::ifstream file("file.txt"); file.rdbuf()->pubsetbuf(Buffer, N);
Pengendalian Tempatan
Locales boleh memperkenalkan overhed prestasi disebabkan oleh operasi yang kompleks seperti penukaran aksara dan penapisan. Pertimbangkan untuk menggunakan tempat C lalai, direka untuk keseragaman dan penukaran minimum.
Penyegerakan
Menyegerakkan dengan stdio nampaknya tidak meningkatkan prestasi. Walau bagaimanapun, adalah mungkin untuk mengakses tetapan global menggunakan std::ios_base::sync_with_stdio.
Pengukuran dan Keputusan
Hasil prestasi berbeza dengan ketara bergantung pada pelaksanaan dan platform. Sesetengah pengguna telah melaporkan C IOStreams yang lebih pantas, manakala yang lain mengalami prestasi yang lebih perlahan.
Kod Penanda Aras
Bagi mereka yang berminat untuk menjalankan penanda aras mereka sendiri, berikut ialah contoh kod:
template <typename Func> double benchmark(Func f, size_t iterations) { f(); timeval a, b; gettimeofday(&a, 0); for (; iterations--;) { f(); } gettimeofday(&b, 0); return (b.tv_sec * (unsigned int)1e6 + b.tv_usec) - (a.tv_sec * (unsigned int)1e6 + a.tv_usec); } struct CRead { CRead(char const* filename): _filename(filename) {} void operator()() { FILE* file = fopen(_filename, "r"); int count = 0; while (fscanf(file,"%s", _buffer) == 1) { ++count; } fclose(file); } char const* _filename; char _buffer[1024]; }; struct CppRead { CppRead(char const* filename): _filename(filename), _buffer() {} enum { BufferSize = 16184 }; void operator()() { std::ifstream file(_filename, std::ifstream::in); file.rdbuf()->pubsetbuf(_buffer, BufferSize); int count = 0; std::string s; while (file >> s) { ++count; } } char const* _filename; char _buffer[BufferSize]; }; int main(int argc, char* argv[]) { size_t iterations = 1; if (argc > 1) { iterations = atoi(argv[1]); } char const* oldLocale = setlocale(LC_ALL,"C"); if (strcmp(oldLocale, "C") != 0) { std::cout << "Replaced old locale '" << oldLocale << "' by 'C'\n"; } char const* filename = "largefile.txt"; CRead cread(filename); CppRead cppread(filename); bool oldSyncSetting = std::ios_base::sync_with_stdio(false); double ctime = benchmark(cread, iterations); double cpptime = benchmark(cppread, iterations); std::ios_base::sync_with_stdio(oldSyncSetting); std::cout << "C : " << ctime << "\n" "C++: " << cpptime << "\n"; return 0; }
Atas ialah kandungan terperinci Adakah C IOStreams Sentiasa Lambat Daripada printf/scanf?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!