Примечание к тестам производительности
От: AlexGin Беларусь  
Дата: 12.03.17 08:47
Оценка: -1 :)))
В этой теме я приводил ссылки на мои тесты производительности, выложенные на гит-хабе:
https://github.com/AlexGin/Math.git

Некоторые наши коллеги заметили, что если в приведенном ниже тесте:
Блокировать / комментировать участок работы с GUI, начинаются жуткие тормоза:
void MainWindow::nativeComputeTrg() // Trigonometry
{
   ui->labelMode->setText("Trigonometry - start of perform...");

   ui->progressBar->setValue(2); // start position of progress-bar

   std::time_t timeStart = std::time(0);
   double resultDbl = 0.0;    
   for(int i = 2; i < N_MULTIPLY; i++)
   {
      for( int j = 0; j < N_GENERATED; j++ )
      {
         double dbMult = (double)(i * 2 * M_PI);
         resultDbl = randDbl[j] + sin(dbMult);
         resultDbl += 0.375;
         outpDbl[j] = resultDbl;
      }
// Если блокировать (комментировать) данный участок - в тригонометрическом тесте видим жуткие тормоза:
      // if (!(i % 100000))
      // {
      //    int val = ui->progressBar->value();
      //    ui->progressBar->setValue(++val);
      //}     
   }
   std::time_t timeStop = std::time(0);
   ui->labelMode->setText("Trigonometry - complete!");

   std::string strMode("Trigonometry");
   ShowDuration(timeStart, timeStop, strMode);
   ui->pushBtnStart->setEnabled(false);
}


Смею заверить товарищей, тормозов не будет — всё будет работать великолепно — если вместо работы с GUI поставить прокачку сообщений OS Windows:
      MSG msg;
      while (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
      {    /* Loop of message-processing: */
          ::DispatchMessage(&msg);
      }


// Вариант — для применения вместе с Qt:
    if (!(i % 100000))
       QCoreApplication::processEvents();


ПРИМЕЧАНИЕ:
В результате экспериментов было выяснено — что:
Это явление имеет место в результате бага компилятора MSVC 2015!

Здесь даже не обязательна прокачка сообщений! Так, если вставить в данный участок:
    if (i == 0)
        std::cout << "it's bullshit"; // Мы никогда не достигнем данной точки


Всё восстанавливается.
Также всё восстанавливается, если вычисление sin(dbMult) вынести из внутреннего цикла.
Отредактировано 13.03.2017 7:14 AlexGin . Предыдущая версия . Еще …
Отредактировано 12.03.2017 8:52 AlexGin . Предыдущая версия .
Отредактировано 12.03.2017 8:50 AlexGin . Предыдущая версия .
Отредактировано 12.03.2017 8:49 AlexGin . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.