У меня есть функция, коэффициент которой нужно отрегулировать в соответствии с нагрузкой на машину, чтобы она точно соответствовала времени стены, переданной функции. Коэффициент может варьироваться в зависимости от нагрузки машины.
void execute_for_wallTime(int factor, int wallTime)
{
double d = 0;
for (int n = 0; n<factor; ++n)
for (int m = 0; wall_time; ++m)
d += d * n*m;
}
Есть ли способ динамически проверить нагрузку на машину и соответствующим образом отрегулировать коэффициент, чтобы использовать точное время стены, переданное функции?
Время стены читается из файла и передается этой функции. Значения приведены в микросекундах, например:
73
21
44
Согласно комментарию ОП:
#include <sys/time.h>
int deltaTime(struct timeval *tv1, struct timeval *tv2){
return ((tv2->tv_sec - tv1->tv_sec)*1000000)+ tv2->tv_usec - tv1->tv_usec;
}
//might require longs anyway. this is time in microseconds between the 2 timevals
void execute_for_wallTime(int wallTime)
{
struct timeval tvStart, tvNow;
gettimeofday(&tvStart, NULL);
double d = 0;
for (int m = 0; wall_time; ++m){
gettimeofday(&tvNow, NULL);
if(deltaTime(tvStart,tvNow) >=wall_time) { // if timeWall is 1000 microseconds,
// this function returns after
// 1000 microseconds (and a
// little more due to overhead)
return;
}
d += d*m;
}
}
Теперь работайте с timeWall, увеличивая или уменьшая его в логике вне этой функции в зависимости от ваших вычислений производительности. Эта функция просто работает в течение микросекунд timeWall.
Для стиля C ++ вы можете использовать станд :: хроно.
Я должен прокомментировать, что я бы обработал вещи по-другому, например, вызвав nanosleep (). Операции не имеют смысла, если только в реальном коде вы не планируете заменять эти «заполнители» фактическими операциями. В этом случае вы можете рассмотреть потоки и планировщики. Помимо часов звонки добавить накладные расходы.
Других решений пока нет …