C++ 在c&x2B执行过程中执行措施+;每t毫秒编码一次

C++ 在c&x2B执行过程中执行措施+;每t毫秒编码一次,c++,c,C++,C,给定while循环,函数顺序如下: int k=0; int total=100; while(k<total){ doSomething(); if(approx. t milliseconds elapsed) { measure(); } ++k; } intk=0; 整数合计=100; 而(k高分辨率计时是特定于平台的,您没有在问题中指定。标准库时钟()函数返回一个计数,该计数以每秒时钟数递增。在某些平台上,这可能足够快,可以为您提供所需的分辨率,但您应该检查系

给定while循环,函数顺序如下:

int k=0;
int total=100;
while(k<total){
   doSomething();
   if(approx. t milliseconds elapsed) { measure(); }
   ++k;
}
intk=0;
整数合计=100;

而(k高分辨率计时是特定于平台的,您没有在问题中指定。标准库时钟()函数返回一个计数,该计数以每秒时钟数递增。在某些平台上,这可能足够快,可以为您提供所需的分辨率,但您应该检查系统的滴答率,因为它是由实现定义的。但是,如果您发现它足够高,则:

#define SAMPLE_PERIOD_MS 100
#define SAMPLE_PERIOD_TICKS ((CLOCKS_PER_SEC * SAMPLE_PERIOD_MS) / 1000)

int k=0;
int total=100;
clock_t measure_time = clock() + SAMPLE_PERIOD_TICKS  ;
while(k<total)
{
   doSomething();
   if( clock() - measure_time > 0 )
   { 
        measure(); 
        measure_time += SAMPLE_PERIOD_TICKS ;
        ++k;
   }
}

measure\u thread()
的代码只有在
measure()
的运行时间可以忽略不计的情况下才是准确的。如果它需要很长的时间,您可能需要考虑这一点。如果它是不确定的,您甚至可能需要测量它的执行时间以减去睡眠时间。

在调用doSomething()之前获取时间,获取之后的时间,计算差异,如果经过了t毫秒,则测量它。什么是doSomething()需要的时间超过t?平台特定的高分辨率计时器可用于获取经过的毫秒数。
doSomething()需要多长时间
take?你需要哪种毫秒分辨率,1-2?5-10?50-100?标题是“中断”。你想中断doSomething()吗执行测量?这是完全不同的。让采样探查器成为一个单独的进程或线程非常重要,这样您就可以实际中断代码执行。缺少所需的操作系统和工具细节。但是采样探查器是一个非常标准的工具,重新发明它将是一个错误l、 正如我在编辑中所述:为了消除实际中断的需要,可以在每次函数调用后执行这些措施。换句话说,有必要允许“doSomething”执行其任务。答案解释了我可能遇到的大多数问题。请注意,我已经经历了一些不一致的结果,其中根据测量,渐进更快的算法实际上需要更多的时间。这种情况偶尔会发生,但不适合在实验环境中演示一种方法的优越性。无论如何,代码将受到数百个样本的影响,具有不同的参数,因此最终结果应该是“足够公平的”。这与urse完全取决于测量的内容和目的,但在某些情况下,采样抖动可能非常关键。例如,在闭环控制系统中,采样和控制中的抖动都可能严重影响稳定性。任何对测量做出实时决策的情况都需要将抖动相对t降至最低o采样时间。
int main()
{
    StartThread( measure_thread, HIGH_PRIORITY ) ;
    for(;;)
    {
        doSomething() ;
    }
}

void measure_thread()
{
    for(;;)
    {
        measure() ;
        sleep( SAMPLE_PERIOD_MS ) ;
    }
}