fprintf对时间戳计数器有奇怪的影响

时间:2018-09-12 14:30:29

标签: c performance readfile

我有两个柜台:

//img.attr('src', 'pages/' +  page + '.jpg');
img.attr('src', 'pages/' +  page + '.' + extension );

如果我要评论#define number_of_ccr 1024 unsigned int lpBuffer[number_of_ccr] = {0}; unsigned long nNumberOfBytesToRead = number_of_ccr*4; unsigned long lpNumberOfBytesRead; unsigned int counter = 0; unsigned int error = 0; QueryPerformanceCounter(&fullCounter); // first counter for(;;) { QueryPerformanceCounter(&startCounter); // second counter error = ReadFile( hSerial, lpBuffer, nNumberOfBytesToRead, &lpNumberOfBytesRead, NULL ); if(!strcmp(lpBuffer, "end")) { CloseHandle(FileHandle); //char *copyString = "copy"; //WriteFile(hSerial, copyString , strlen(copyString), &bytes_written, NULL); fprintf(stderr, "end flag was received\n"); break; } else if(lpNumberOfBytesRead == nNumberOfBytesToRead) { // NOTE(): succeed QueryPerformanceCounter(&endCounter); time += Win32GetSecondsElapsed(startCounter, endCounter); //second counter DWORD BytesWritten; // write data to file WriteFile(FileHandle, lpBuffer, lpNumberOfBytesRead, &BytesWritten, 0); if(!(lpBuffer[0] % 1024)) { fprintf(stderr, "bytes %d \r", lpBuffer[0]);// <--- THIS LINE } } else if(lpNumberOfBytesRead < nNumberOfBytesToRead) { fprintf(stderr, "bytes %d \n", lpNumberOfBytesRead); } }// for(;;) QueryPerformanceCounter(&fullCounterEnd); fullTime = Win32GetSecondsElapsed(fullCounter, fullCounterEnd); char DebugBuffer[256]; fprintf(stderr, "time: %f \n", time); fprintf(stderr, "full time: %f \n", fullTime); ,第二个计数器将与第一个计数器(fullCounter)大致相同。当该行取消注释时,第二个计时器几乎比第一个计数器少两倍。此行的存在是唯一的区别。

总体: 如果fprintf(stderr, "bytes %d \r", lpBuffer[0]);// <--- THIS LINE没有被评论,我的计数器将显示更好的fprintf性能->第二个计数器的时间更短

如果readfile评论我的表现很差->第二个计数器还有更多时间

编译器标志:cl -Z7 -nologo -Fmsource.map ../ code / source.c

cmder日志:

fprintf

我的问题是,为什么会这样?它对我的程序有什么影响?

2 个答案:

答案 0 :(得分:3)

在执行fprintf时,串行会不断累积输入数据。下次尝试读取数据时,数据将立即可用。如果没有fprintf,则程序必须在ReadFile内部等待。因此存在差异。

答案 1 :(得分:0)

在控制台上打印可能是一项非常耗时的操作,很多时候甚至达到数千个时钟周期。 看看这个link,它解释了使用printf所花费的时间。我知道您使用的是fprintf,但是目标文件仍然是控制台输出,因此需要中断,上下文切换,在控制台上打印等整个过程。 我从链接中引用了这段代码:

int main( void )
{
    int i = 89;

    printf("hello, world %d\n", i);
}

这似乎是一个小的快速代码,但在RISC CPU上需要6371个周期。因此,假设有一个1MHz的RISC CPU,这将需要6 ms以上的时间来执行。

现在想像一下,如果您在具有OS的计算机上运行代码,则进程与线程之间的切换以及中断例程会带来更大的延迟。