В этой теме я приводил ссылки на мои тесты производительности, выложенные на гит-хабе:
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) вынести из внутреннего цикла.