C++ C++,计时器,毫秒 #包括 #包括 #包括 使用名称空间std; 双差分时钟(时钟1、时钟2) { 双diffticks=时钟1-2; 双diffms=(diffticks)/(时钟每秒/1000); 返回diffms; } int main() { 时钟启动=时钟(); 对于(int i=0;i++) { 如果(i==10000)中断; } clock_t end=clock(); cout

C++ C++,计时器,毫秒 #包括 #包括 #包括 使用名称空间std; 双差分时钟(时钟1、时钟2) { 双diffticks=时钟1-2; 双diffms=(diffticks)/(时钟每秒/1000); 返回diffms; } int main() { 时钟启动=时钟(); 对于(int i=0;i++) { 如果(i==10000)中断; } clock_t end=clock(); cout,c++,timer,C++,Timer,首先你应该减去结束-开始,而不是相反。 文档中说,如果值不可用,clock()返回-1,您检查过了吗? 编译程序时使用什么优化级别?如果启用优化,编译器可以有效地完全消除循环。问题似乎是循环太短。我在我的系统上尝试了它,它给出了0个刻度。我检查了diffticks是什么,它是0。将循环大小增加到100000000,因此没有问题iceable时滞,我得到-290作为输出(错误——我认为diffticks应该是clock2-clock1,所以我们应该得到290而不是-290)。我还尝试在分区中将“1

首先你应该减去结束-开始,而不是相反。
文档中说,如果值不可用,clock()返回-1,您检查过了吗?
编译程序时使用什么优化级别?如果启用优化,编译器可以有效地完全消除循环。

问题似乎是循环太短。我在我的系统上尝试了它,它给出了0个刻度。我检查了diffticks是什么,它是0。将循环大小增加到100000000,因此没有问题iceable时滞,我得到-290作为输出(错误——我认为diffticks应该是clock2-clock1,所以我们应该得到290而不是-290)。我还尝试在分区中将“1000”改为“1000.0”,但没有成功


使用优化编译确实会删除循环,因此您不必使用它,也不必让循环“做点什么”,例如,增加循环体中循环计数器以外的计数器。至少GCC是这样做的。

乍一看,您似乎是在从较小的值中减去较大的值。您调用:

#include <iostream>
#include <conio.h>
#include <ctime>



using namespace std;

double diffclock(clock_t clock1,clock_t clock2)
{
    double diffticks=clock1-clock2;
    double diffms=(diffticks)/(CLOCKS_PER_SEC/1000);
    return diffms;
}
int main()
{
    clock_t start = clock();
    for(int i=0;;i++)
    {

    if(i==10000)break;
    }
    clock_t end = clock();

    cout << diffclock(start,end)<<endl;

    getch();
return 0;
}
但diffclock的定义如下:

diffclock( start, end );
除此之外,它可能与您转换单位的方式有关。使用1000转换为毫秒在本页上有所不同:


这里有几个问题。第一个问题是,在传递到
diffclock()时,您显然切换了启动和停止时间
函数。第二个问题是优化。任何启用了优化的合理智能编译器都会简单地丢弃整个循环,因为它没有任何副作用。但即使解决了上述问题,程序也很可能打印0。如果你试图想象每秒执行数十亿次操作,那么抛出复杂的d现代CPU采用的无序执行、预测和大量其他技术,即使是一个CPU也可能会优化循环。但即使它没有优化循环,你也需要大量超过10K的迭代才能使其运行更长时间。你可能需要程序运行一两秒钟才能得到
clock()
反映任何东西

但最重要的问题是
clock()
本身。该函数不适用于任何时间的性能测量。它所做的是为您提供程序使用的处理器时间的近似值。除了任何给定实现可能使用的近似方法的模糊性质之外(因为标准不要求有任何具体内容),POSIX标准还要求
每秒时钟数
等于
1000000
,与实际分辨率无关。换句话说,不管时钟有多精确,也不管CPU运行的频率是多少。简单地说,这是一个完全无用的数字,因此是一个完全无用的函数它仍然存在的唯一原因可能是历史原因。所以,请不要使用它

为了实现您所寻找的目标,人们习惯于以用于读取的相应CPU指令的名称来读取也称为“RDTSC”的指令。然而,如今,这也基本上是无用的,因为:

  • 现代操作系统可以轻松地将程序从一个CPU迁移到另一个CPU。您可以想象,在另一个CPU上运行一秒钟后读取另一个CPU上的时间戳没有多大意义。只有在最新的Intel CPU中,计数器才能跨CPU核同步。总之,仍然可以做到这一点,但需要大量额外的时间必须小心(即,once可以设置流程的关联性等)
  • 通常,测量程序的CPU指令并不能准确描述它实际使用了多少时间。这是因为在实际程序中,可能会有一些系统调用,其中工作由操作系统内核代表进程执行。在这种情况下,不包括该时间
  • 操作系统可能会长时间暂停进程的执行。即使只需几条指令就可以执行,但对用户来说,这似乎是一秒钟。因此,这样的性能度量可能是无用的
  • 那怎么办呢

    在分析时,必须使用类似的工具。它可以跟踪大量CPU时钟、缓存未命中、执行的分支、未命中的分支、进程从一个CPU移动到另一个CPU的次数等。它可以用作工具,也可以嵌入到应用程序中(类似)

    如果问题是关于实际花费的时间,人们会使用挂钟。最好是高精度的挂钟,这也不受NTP调整的影响(单调)。这可以准确地显示经过了多少时间,不管发生了什么。出于这个目的,可以使用它。它是SUSv2 POSIX.1-2001标准的一部分。鉴于此,请使用
    getch()
    要保持终端打开,我假设您使用的是Windows。不幸的是,您没有
    clock\u gettime()
    ,最接近的是性能计数器API:

        double diffclock( clock_t clock1, clock_t clock2 ) {
    
            double diffticks = clock1 - clock2;
            double diffms    = diffticks / ( CLOCKS_PER_SEC / 1000 );
    
            return diffms;
        }
    
    对于一个可移植的解决方案,最好的选择是C++11,但大多数工业级编译器(GCC、Clang、MSVC)都支持它

    下面是一个如何使用它的示例。请注意,因为我知道我的CPU将以超过毫秒的速度以整数的方式执行10000次增量,所以我将其更改为微秒。我还将计数器声明为
    volatile
    ,希望编译器不会对其进行优化

    BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);
    BOOL QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount);
    

    希望有帮助。祝你好运!

    注意:这在c++11之后可用

    您可以使用std::chrono库。 chrono有两个区
    #include <ctime>
    #include <chrono>
    #include <iostream>
    
    int main()
    {
        volatile int i = 0; // "volatile" is to ask compiler not to optimize the loop away.
        auto start = std::chrono::steady_clock::now();
        while (i < 10000) {
            ++i;
        }
        auto end = std::chrono::steady_clock::now();
        auto elapsed = std::chrono::duration_cast<std::chrono::microseconds>(end - start);
        std::cout << "It took me " << elapsed.count() << " microseconds." << std::endl;
    }
    
    $ g++ -std=c++11 -Wall -o test ./test.cpp && ./test
    It took me 23 microseconds.
    
    #include <chrono> 
    using namespace std::chrono;
    
    auto start = high_resolution_clock::now();
    
    auto stop = high_resolution_clock::now();
    
    auto duration = duration_cast<microseconds>(stop - start);
    cout << duration.count() << endl;