fprintf оказывает странное влияние на счетчик меток времени - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть два счетчика:

#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

журнал cmder:

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

Мой вопрос: почему это происходит?Какое влияние это оказывает на мою программу?

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Пока выполняется fprintf, последовательный порт продолжает накапливать входящие данные. В следующий раз, когда вы попытаетесь прочитать, данные будут легко доступны. Без fprintf программа должна ждать его внутри ReadFile. Поэтому расхождение.

0 голосов
/ 12 сентября 2018
Печать

на консоли может быть трудоемкой операцией, во многих случаях достигающей даже тысяч тактов.Взгляните на эту ссылку , где объясняется время, затрачиваемое с помощью printf.Я знаю, что в вашем случае вы используете fprintf, но ваш конечный файл по-прежнему выводится на консоль, поэтому требуется весь процесс прерывания, переключения контекста, печати на консоли и т. Д. Я цитирую этот фрагмент кода по ссылке:

int main( void )
{
    int i = 89;

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

Это может показаться небольшим и быстрым кодом, но он требует 6371 циклов на ЦП RISC.Итак, представьте, что у вас есть процессор RISC с тактовой частотой 1 МГц, для его выполнения потребуется более 6 мс.

Теперь представьте, что если вы выполняете свой код на компьютере с ОС, то при переключении между процессами иподпрограммы потоков и прерываний.

...