【问题标题】:Function consuming wall time for specific amount of time功能在特定时间内消耗墙壁时间
【发布时间】:2018-10-30 00:33:21
【问题描述】:

我有一个函数,该函数需要根据机器上的负载进行调整,以准确消耗传递给函数的墙时间。该系数可能因机器负载而异。

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

【问题讨论】:

  • 你认为你为什么需要volatile
  • 我猜你不能只是 nanosleep() for wallTime 微秒,而是需要执行操作。然后,您必须在函数启动和每次迭代时调用时钟,检查差异并与 walltime 进行比较,然后在时间到时返回。这是你想要做的吗?
  • @Attersson 是的,完全一样。我不想使用睡眠,我想执行操作。
  • @NeilButterworth 我删除了 volatile。我不知道为什么它甚至在那里。
  • 除非你在 RTOS 上运行它,否则你想要的是不可能的。

标签: c++ function c++11 cpu wall-time


【解决方案1】:

根据OP评论:

#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++ 风格,您可以使用std::chrono

我必须评论说我会以不同的方式处理事情,例如通过调用 nanosleep()。除非在实际代码中您打算用实际操作替换这些“填充物”,否则这些操作毫无意义。在这种情况下,您可能会考虑线程和调度程序。除了时钟调用之外,还会增加开销。

【讨论】:

  • 有没有办法完全摆脱因子变量,只将墙时间传递给函数?该函数根据传递的值尝试消耗挂墙时间。
  • @ZeeshanHayat 完成。现在怎么样?
  • 它似乎工作正常。谢谢。实际上,由于某些要求,我需要在特定的墙上时间消耗计算能力。我正在运行多个线程,每个线程都会消耗一些 CPU 功率。
  • 不客气。我使用时间函数已经很长时间了,这对我来说很容易。很高兴为您提供帮助!
  • 这个函数适用于单线程程序,但它在多线程程序中给出了非常不同的值。知道为什么吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多