IOStream 성능 향상 전략
대부분의 C 프로그래머는 C로 코딩할 때 우수한 인터페이스를 이유로 printf/scanf 기능을 선호합니다. 그러나 IOStream은 종종 성능 문제에 직면합니다.
버퍼링 최적화
버퍼 크기를 늘리면 HDD 히트 및 시스템 호출이 줄어들어 성능이 향상됩니다. 이는 기본 streambuf에 액세스하고 해당 버퍼를 수정하여 달성할 수 있습니다.
char Buffer[N]; std::ifstream file("file.txt"); file.rdbuf()->pubsetbuf(Buffer, N);
로캘 처리
로캘은 문자 변환과 같은 복잡한 작업으로 인해 성능 오버헤드를 초래할 수 있습니다. 필터링. 균일성과 최소 변환을 위해 설계된 기본 C 로케일을 사용하는 것이 좋습니다.
동기화
stdio와의 동기화는 성능을 향상시키지 않는 것으로 보입니다. 그러나 std::ios_base::sync_with_stdio를 사용하여 전역 설정에 액세스할 수 있습니다.
측정 및 결과
성능 결과는 구현 및 플랫폼에 따라 크게 다릅니다. 일부 사용자는 더 빠른 C IOStream을 보고한 반면 다른 사용자는 느린 성능을 경험했습니다.
벤치마킹 코드
자체 벤치마크 실행에 관심이 있는 사용자를 위한 샘플 코드는 다음과 같습니다.
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; }
위 내용은 C IOStream은 항상 printf/scanf보다 느립니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!