gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 06:50:25 25 4
gpt4 key购买 nike

我有两个计数器:

#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);

如果我要评论fprintf(stderr, "bytes %d \r", lpBuffer[0]);// <--- THIS LINE第二个计数器将与拳头计数器(fullCounter)大约同时出现。当此行未注释时,第二个计时器几乎比第一个计数器少两倍。这条线的存在是唯一的区别。

总体:如果fprintf没有评论我的柜台展示更好readfile性能 --> 第二个计数器的时间更短

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

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

命令日志:

C:\Documents\work\region\testProject\build (master -> origin)
λ source.exe
Opening serial port...OK
Sending bytes...9 bytes written
end flag was received
time: 0.193245
full time: 0.206170
Closing serial port...OK

C:\Documents\work\region\testProject\build (master -> origin)
λ source.exe
Opening serial port...OK
Sending bytes...9 bytes written
end flag was received
time: 0.115640
full time: 0.204010
Closing serial port...OK

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

最佳答案

fprintf 正在执行时,串行不断累积传入数据。下次您尝试阅读时,数据随时可用。如果没有 fprintf,程序必须在 ReadFile 中等待它。因此存在差异。

关于c - fprintf 对时间戳计数器有奇怪的影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52297615/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com