Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C fprintf对时间戳计数器有奇怪的影响_C_Performance_Readfile - Fatal编程技术网

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

C fprintf对时间戳计数器有奇怪的影响,c,performance,readfile,C,Performance,Readfile,我有两个柜台: #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(&a

我有两个柜台:

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

我的问题是,为什么会发生这种情况?它对我的程序有什么影响?

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

int main( void )
{
    int i = 89;

    printf("hello, world %d\n", i);
}
这似乎是一个小而快速的代码,但它需要在RISC CPU上执行6371个周期。因此,想象一下有一个1MHz的RISC CPU,这将需要超过6毫秒的时间来执行


现在想象一下,如果您在带有操作系统的计算机上运行代码,那么进程和线程之间的切换以及中断例程会带来更多的延迟。

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

int main( void )
{
    int i = 89;

    printf("hello, world %d\n", i);
}
这似乎是一个小而快速的代码,但它需要在RISC CPU上执行6371个周期。因此,想象一下有一个1MHz的RISC CPU,这将需要超过6毫秒的时间来执行



现在想象一下,如果您在一台有操作系统的计算机上运行代码,那么在进程和线程之间切换以及中断例程会带来更多的延迟。

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

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

但在我的例子中,readfile函数和一些小代码行所消耗的时间越来越少,而不是越来越多。我理解你的意思了吗?从你的问题中,我指出,对fprintf调用进行注释会使你的程序更快。所以我想你无论如何都要运行ReadFile方法,否则你的缓冲区就不会被填满。对不起,我想我在打印时表达得很糟糕,
readfile
在给定的输出中花费更少的时间无论是否打印,总时间都是相同的。@WernerHenze我已经尝试过在打印时运行这段代码,而不使用clock()函数来计算滴答声。我得到的结果是打印时有95个刻度,而没有一个刻度,所以我不明白如何获得相同的时间…但在我的例子中,readfile函数和一些小代码行所消耗的时间越来越少,而不是更多。我理解你的意思了吗?从你的问题中,我指出,对fprintf调用进行注释会使你的程序更快。所以我想你无论如何都要运行ReadFile方法,否则你的缓冲区就不会被填满。对不起,我想我在打印时表达得很糟糕,
readfile
在给定的输出中花费更少的时间无论是否打印,总时间都是相同的。@WernerHenze我已经尝试过在打印时运行这段代码,而不使用clock()函数来计算滴答声。我得到的结果是打印时有95个刻度,没有一个刻度,所以我不明白你怎么能同时得到…@Gerhardh,我真的很抱歉,我用智能手机应用程序发布了这个问题。我已经在做缩进调整了。幸运的是,您没有提供(串行配置,要读取的字节数),也没有告诉我们如何写入串行。顺便说一下:你的代码被破坏了。它期望a)“end”位于缓冲区的开头,b)“end”在一次
ReadFile
期间被完全读取。这两种假设可能都不正确。lpBuffer的类型是什么(我假设为
char
,但请参见
lpBuffer[0]%1024
)?你总共读了多少字节(多少个块,每个块多少字节)?@WernerHenze,我有来自MCU(cortex m7 h743zi)的串行输入。我确实不能提供可验证的例子,因为它需要一块外部硬件。关于“end”,这是一个小技巧,我可以控制何时发送这个特定的虚拟数据包(第一个缓冲区条目包含0x646E65-“end”)。当执行
fprintf
时,串行数据会不断累积传入数据。下次尝试读取时,数据随时可用。如果没有
fprintf
,程序必须在
ReadFile
中等待它。“所以这是一个矛盾。”格哈德,我真的很抱歉,我用智能手机应用程序发布了这个问题。我已经在做缩进调整了。幸运的是,您没有提供(串行配置,要读取的字节数),也没有告诉我们如何写入串行。顺便说一下:你的代码被破坏了。它期望a)“end”位于缓冲区的开头,b)“end”在一次
ReadFile
期间被完全读取。这两种假设可能都不正确。lpBuffer的类型是什么(我假设为
char
,但请参见
lpBuffer[0]%1024
)?你总共读了多少字节(多少个块,每个块多少字节)?@WernerHenze,我有来自MCU(cortex m7 h743zi)的串行输入。我确实不能提供可验证的例子,因为它需要一块外部硬件。关于“end”,这是一个小技巧,我可以控制何时发送这个特定的虚拟数据包(第一个缓冲区条目包含0x646E65-“end”)。当执行
fprintf
时,串行数据会不断累积传入数据。T