我有两个柜台:
//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
我的问题是,为什么会这样?它对我的程序有什么影响?
答案 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的计算机上运行代码,则进程与线程之间的切换以及中断例程会带来更大的延迟。