相关疑难解决方法(0)

轻松测量经过的时间

我正在尝试使用time()来衡量我的程序的各个点.

我不明白为什么之前和之后的值是一样的?我知道这不是描述我的程序的最佳方式,我只想看看有多长时间.

printf("**MyProgram::before time= %ld\n", time(NULL));

doSomthing();
doSomthingLong();

printf("**MyProgram::after time= %ld\n", time(NULL));
Run Code Online (Sandbox Code Playgroud)

我试过了:

struct timeval diff, startTV, endTV;

gettimeofday(&startTV, NULL); 

doSomething();
doSomethingLong();

gettimeofday(&endTV, NULL); 

timersub(&endTV, &startTV, &diff);

printf("**time taken = %ld %ld\n", diff.tv_sec, diff.tv_usec);
Run Code Online (Sandbox Code Playgroud)

我如何阅读结果**time taken = 0 26339?这是否意味着26,339纳秒= 26.3毫秒?

那怎么说**time taken = 4 45025,这意味着4秒和25毫秒?

c c++ linux time measurement

272
推荐指数
12
解决办法
48万
查看次数

System.nanoTime()完全没用吗?

Java博客文章Beware of System.nanoTime()中所述,在x86系统上,Java的System.nanoTime()使用CPU特定计数器返回时间值.现在考虑以下用于测量呼叫时间的情况:

long time1= System.nanoTime();
foo();
long time2 = System.nanoTime();
long timeSpent = time2-time1;
Run Code Online (Sandbox Code Playgroud)

现在在多核系统中,可能是在测量time1之后,线程被调度到不同的处理器,其计数器小于先前CPU的计数器.因此,我们可以得到time2中的值,该值小于 time1.因此,我们将在timeSpent中得到负值.

考虑到这种情况,是不是System.nanotime现在几乎没用?

我知道改变系统时间不会影响纳米时间.这不是我上面描述的问题.问题是每个CPU都会在打开后保留不同的计数器.与第一个CPU相比,第二个CPU上的计数器可以更低.由于在获取time1之后OS可以将线程调度到第二个CPU,因此timeSpent的值可能不正确甚至是负数.

java nanotime

151
推荐指数
8
解决办法
11万
查看次数

Mac OS X中的clock_gettime替代方案

在通过MacPorts安装必要的库后编译我在Mac OS X上编写的程序时,我收到此错误:

In function 'nanotime':
error: 'CLOCK_REALTIME' undeclared (first use in this function)
error: (Each undeclared identifier is reported only once
error: for each function it appears in.)
Run Code Online (Sandbox Code Playgroud)

它似乎clock_gettime没有在Mac OS X中实现.是否有另一种方法可以在纳秒内获得纪元时间?不幸的是在几微秒内.gettimeofday

c macos time clock

65
推荐指数
7
解决办法
9万
查看次数

C:使用clock()来测量多线程程序中的时间

我一直用clock()来测量我的应用程序从开始到结束的时间,因为;

int main(int argc, char *argv[]) {
  const clock_t START = clock();

  // ...

  const double T_ELAPSED = (double)(clock() - START) / CLOCKS_PER_SEC;
}
Run Code Online (Sandbox Code Playgroud)

由于我已经开始使用POSIX线程,这似乎失败了.看起来clock()用N个线程增加N倍.由于我不知道将同时运行多少个线程,因此这种方法失败了.那么如何衡量已经过了多少时间呢?

c

48
推荐指数
1
解决办法
5万
查看次数

使用C++和Linux的高分辨率计时器?

在Windows下也有像一些方便的功能,QueryPerformanceCountermmsystem.h创建高分辨率定时器.Linux有类似的东西吗?

c++ linux timer

46
推荐指数
4
解决办法
8万
查看次数

C++的时差

有谁知道如何用毫秒计算C++的时差?我曾经使用difftime但它没有足够的精度来衡量我正在测量的东西.

c++ time

31
推荐指数
4
解决办法
5万
查看次数

将clock_gettime移植到窗口

我在qnx momemntics上运行以下代码.

#define BILLION 1000000000L;

struct timespec start_time;
struct timespec stop_time; 

void start MyTestFunc() {
    //Initialize the Test Start time
     clock_gettime(CLOCK_REALTIME,&start_time)
    // ... additonal code.

    cout << "The exectuion time of func "<< calculateExecutionTime();
}


double calculateExecutionTime ()
{

    clock_gettime(CLOCK_REALTIME,&stop_time);

    double dSeconds = (stop_time.tv_sec - start_time.tv_sec);

    double dNanoSeconds = (double)( stop_time.tv_nsec - start_time.tv_nsec ) / BILLION;

    return dSeconds + dNanoSeconds;
}
Run Code Online (Sandbox Code Playgroud)

现在我想将代码移植到Windows上.任何人都可以提供示例代码.

谢谢!

c c++ windows

19
推荐指数
4
解决办法
4万
查看次数

使用RDTSC获取cpu周期 - 为什么RDTSC的值总是增加?

我想在特定点获得CPU周期.我在这一点上使用这个功能:

static __inline__ unsigned long long rdtsc(void)
{
    unsigned long long int x;
    __asm__ volatile (".byte 0x0f, 0x31" : "=A" (x));
    return x;
}
Run Code Online (Sandbox Code Playgroud)

问题是它总是返回一个增加的数字(在每次运行中).就好像它指的是绝对时间.

我错误地使用了这些功能吗?

linux x86 assembly cpu-usage

16
推荐指数
2
解决办法
3万
查看次数

CPU TSC获取操作,尤其是在多核多处理器环境中

在Linux世界中,要获得纳秒精度定时器/时钟提示,可以使用:

#include <sys/time.h>

int foo()
{
   timespec ts;

   clock_gettime(CLOCK_REALTIME, &ts); 
   //--snip--      
}
Run Code Online (Sandbox Code Playgroud)

这个答案提出了asm一种用RDTSC指令直接查询cpu时钟的方法.

在多核,多处理器架构中,这个时钟滴答/定时器值如何在多个内核/处理器之间同步?我的理解是,在固有的围栏中完成了.这种理解是否正确?

你能否提出一些可以详细解释这个问题的文件?我对Intel Nehalem和Sandy Bridge微体系结构感兴趣.

编辑

将进程限制为单个核心或cpu不是一种选择,因为该进程非常庞大(就消耗的资源而言)并且希望最佳地利用包含所有核心和处理器的机器中的所有资源.

编辑

感谢您确认TSC在核心和处理器之间同步.但我最初的问题是这种同步是如何完成的?它是否带有某种围栏?你知道任何公共文件吗?

结论

感谢所有输入:以下是此讨论的结论:TSC在初始化时使用在多处理器/多核系统中的核心和处理器之间发生的RESET进行同步.之后,每个Core都是独立的.TSC与锁相环保持不变,这将使频率变化正常化,从而使给定Core内的时钟变化正常化,这就是TSC在核心和处理器之间保持同步的方式.

c assembly multicore cpu-registers microprocessors

14
推荐指数
4
解决办法
7895
查看次数

以纳秒为单位获取当地时间

可能重复:
C++定时器功能,以纳秒为单位提供时间

我需要以纳秒分辨率来测量函数执行的持续时间.可能吗?我们普通的计算机硬件和软件能够给出如此精确的时间吗?如果是,如何使用c ++实现这一目标?是否可以使用Boost库?

c++ time benchmarking boost

14
推荐指数
1
解决办法
6万
查看次数