2017-09-19 11 views
0

윈도우,이 테스트 코드를 실행 :왜 stdout로 freopened 파일을 쓰는 것이 더 빠릅니까?

  • write with freopen clocks elapsed: 2767
  • write with fopen clocks elapsed: 8337

이유 :

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h> 
#include <time.h> 
#include <assert.h> 

int main() { 
    // The clock() function returns an approximation of processor time used by the program. 
    // The value returned is the CPU time used so far as a clock_t; 
    // to get the number of seconds used, divide by CLOCKS_PER_SEC. 
    auto buf = new char[1048576]; // 1MB 
    auto cache = new char[512 * 1024]; 

    // initialize the buffer 
    for (int i = 0; i < 1048576; ++i) 
     buf[i] = i; 

    auto fp_reopen = freopen("data_freopen.bin", "wb", stdout); 
    assert(fp_reopen != nullptr); 
    setvbuf(fp_reopen, cache, _IOLBF, 512 * 1024); 
    auto clock_begin = clock(); 
    for (int i = 0; i < 1000; ++i) { 
     auto n = fwrite(buf, 1048576, 1, fp_reopen); 
     assert(n == 1); 
    } 
    fflush(fp_reopen); 
    auto clock_end = clock(); 

#ifdef _WIN32 
    freopen("CONOUT$", "w", stdout); 
#else 
    freopen("/dev/tty", "w", stdout); 
#endif 

    printf("write with freopen clocks elapsed: %zu\n", clock_end - clock_begin); 

    auto fp = fopen("data_fopen.bin", "wb"); 
    assert(fp != nullptr); 
    setvbuf(fp, cache, _IOLBF, 512 * 1024); 
    clock_begin = clock(); 
    for (int i = 0; i < 1000; ++i) { 
     auto n = fwrite(buf, 1048576, 1, fp); 
     assert(n == 1); 
    } 
    fflush(fp); 
    clock_end = clock(); 
    fclose(fp); 

    printf("write with fopen clocks elapsed: %zu\n", clock_end - clock_begin); 
    delete[] buf; 
    delete[] cache; 
    getchar(); 
} 

이 결과를 생성?

+0

코드를 오프 사이트에서 호스팅하는 대신 질문의 일부로 포함하십시오. 그것을 이해하기 위해 Stack Overflow를 떠날 필요가 없습니다. – Chris

+3

두 가지 테스트를 바꾸고 다시 시도하십시오. –

+0

@Chris 죄송합니다. 나는 휴대 전화로 질문을 편집했다. 알림 및 도움에 감사드립니다. – vertextao

답변

2

귀하의 질문은 특정 시스템 매우 흥미롭지 만 : 모두/X, 그 소리와 애플의 libc OS에

  • 을 실행하기위한

    GCC와 Glibc의 리눅스에
    • , 나는 매우 비슷한 타이밍을 얻을 fopen 타이밍은 freopen보다 약간 빠르다.
    • getchar()에 대한 최종 호출에서 알 수 있듯이 Windows에서 테스트를 실행하고 있습니다 ... 불행히도이 시스템을 테스트하여 교차 관찰을 테스트 할 수는 없습니다.

    Microsoft가 런타임 라이브러리에서 이상한 것을했을 수도 있지만 실제로는 2 개의 개별 1GB 파일을 실제로 벤치마킹하고있을 가능성이 큽니다. 파일 시스템의 상태, 캐시 또는 기타 OS 고유의 원인으로 인해 두 번째 파일이 첫 번째 파일보다 작성하는 데 더 오래 걸릴 수 있습니다. 파일을 닫은 후 각 파일을 제거하여이 잠재적 인 부작용을 제거하거나 제거해야하며 다른 순서로 테스트를 실행 해보십시오.

  • +0

    네, 맞습니다. 테스트 주문을 변경하면 결과가 취소됩니다. *'fopen 클록 경과 후 쓰기 : 2346' *'freopen 클록 경과 후 쓰기 : 8088' – vertextao