如何以最小的延迟一个接一个地调用两个函数?

时间:2014-06-22 12:58:10

标签: c++ linux time system-calls rdtsc

我实现了一个返回时间的快速函数(使用rdtsc),我们称之为fast_time()。我有参考使用系统调用的原始函数,我们称之为system_time()。我的程序使用fast_time(),但在一个单独的线程中,我一直在运行一个while循环来检查从my函数返回的时间与原始函数之间的差异是否大于预定义的阈值。像

这样的东西
while (true)
{
    if (abs((fast_time() - system_time()).microseconds()) > MICROSECONDS_THRESHOLD)
    {
        report error
    }
}

通常我看不到错误,但有时我会得到它们,我想更好地理解这个问题。我首先怀疑在system_time()返回后不会立即调用fast_time()。如何强制程序尽可能“原子地”执行fast_time() - system_time()

1 个答案:

答案 0 :(得分:2)

由于几个原因,rdtsc本质上是不可靠的实时测量方法:

1)每个HW线程将返回不同的值,因此如果您的线程没有锁定到一个HW线程,您将获得不同的值。因此,时间可能会意外地来回跳转,具体取决于操作系统如何安排线程

更重要的是:

2)CPU限制会导致CPU的频率意外改变。因为rdtsc测量执行的周期而不是时间,你可以通过将周期数除以CPU频率来可靠地获得经过的时间(在两个rdtsc调用之间,频率可能随机变化)

同样在您的特定测试用例中,OS可以调度线程在fast_time()和system_time()调用之间产生,从而导致测量时间之间的差异,即使fast_time()将返回正确的值。所以为了回答你的问题,我不认为有任何办法可以阻止这一点。