C++ C++;测量函数执行时间的非常奇怪的行为-我的头爆炸了

C++ C++;测量函数执行时间的非常奇怪的行为-我的头爆炸了,c++,timer,C++,Timer,除了我的头爆炸,这就是发生的事情 我想测量一个类中方法的执行时间。 该方法太快,无法使用QueryPerformanceCounter、GetTickCount或Clock获得准确的时间 我调用了2000次该方法并测量了所经过的时间 start=clock(); for (i=0;i<2000;i++) { myObject->myMethod(x); } end = clock()-start; printf("->Partial time: %d\n&qu

除了我的头爆炸,这就是发生的事情

我想测量一个类中方法的执行时间。 该方法太快,无法使用QueryPerformanceCounter、GetTickCount或Clock获得准确的时间

我调用了2000次该方法并测量了所经过的时间

start=clock();
for (i=0;i<2000;i++)
{
    myObject->myMethod(x);
}
end = clock()-start;
printf("->Partial time: %d\n", end);    
时间增加了:

Partial time: 1260 
Partial time: 1890
Partial time: 2530
Partial time: 3700
Partial time: 4100
Partial time: 5360
etc
我不明白为什么会这样


谢谢大家的回答

我还想提一提电话:

testingFunction(myObject,1,0,2000);
//myMethod is called 2000 times with arguments 0-1999
提供比累计呼叫时间更长的时间

testingFunction(myObject,1,0,1000); 
//myMethod is called 1000 times with arguments 0-999
testingFunction(myObject,1,1000,2000);
//myMethod is called 1000 times with arguments 1000-1999

看起来myMethod()方法正在使用一些正在使用的资源。在>初始版本中,您正在重新设置资源,但在扩展版本中,您继续使用>越来越多。实际答案在“myObject”中,因此我们需要类声明>和所有方法定义以及调用测试的代码位。您应该做的是提供一段其他人可以测试的可编译代码马丁·约克2小时前

myObject实际上是使用COM的dll的接口(我说的对吗?)。我自己没有dll的代码,我只能看到接口有哪些方法

开始时的dll加载一些记录,myMethod搜索这些记录。 有人建议这可能是由于缓存未命中。但时间甚至可以增加到20秒(几乎是20倍)。缓存未命中所创建的不是太大了吗

约翰·迪柏林写道

50毫秒对我来说太快了 要测量的QueryPerformanceCounter()? 然后是
QueryPerformanceCounter()未在您的平台或您的计算机上实现 我们用错了

不是50毫秒。1.1-1.3秒/2000=1100-1300毫秒/2000=0.55毫秒-0.65毫秒这对于我电脑上的QueryPerformanceCounter()来说太快了

@费斯托:是的,这是在这里发布时的一个拼写错误。
e、 詹姆斯,谢谢你花了这么多时间在这件事上

打字错误?那个逗号应该是分号吗

for (i=startAt;i<endAt,i++)
     {
         myObject->myMethod(i);
     }
for(i=startAt;imyMethod(i);
}

如果您发布了一个可编译的示例,说明您正在做什么,这将非常有帮助

在此之前,我建议您使用示例中的gettimeofday()来测量时间

如果您今天觉得有点懒,可以将此函数添加到源代码中:

#include <sys/time.h> 

long myclock()
{
    struct timeval tv;
    gettimeofday(&tv, NULL);
    return (tv.tv_sec * 1000000) + tv.tv_usec;
}
#包括
长myclock()
{
结构时间值电视;
gettimeofday(&tv,NULL);
返回(tv.tv_sec*1000000)+tv.tv_usec;
}
然后,要在代码上测量时间,您可以执行以下操作:

long start = myclock();

for (i=0;i<2000;i++)
{
    myObject->myMethod(x);
}

long diff = myclock() - start;
std::cout << "[" << time->tm_hour << ":"<< time->tm_min << ":" << time->tm_sec << 
             "] time:" << std::setprecision(3) << diff/1000000.0 << std::endl;
long start=myclock();
对于(i=0;imyMethod(x);
}
long diff=myclock()-开始;

std::cout肯定还有其他原因。下面是我用您的测试代码创建的一个快速示例程序:

#include <stdio.h>
#include <time.h>

class MyObject
{
    public:
        void myMethod(int i) { for (long k=0; k<100000; k++) { } }
};

void testingFunction(MyObject *myObject,
                     int numberOfRepetitions,
                     int startAt, int endAt) 
{
    int i,j; 
    clock_t start,end; 
    for (j=0;j<numberOfRepetitions;j++) 
    { 
         start=clock();
         for (i=startAt;i<endAt;i++) 
         { 
             myObject->myMethod(i); 
         } 
         end = clock()-start; 
         printf("->Partial time: %d\n", end); 
    } 
 } 


int main(int argc, char * argv[])
{
    MyObject myObject;

    for (int i = 0; i < 10; i++)
    { testingFunction(&myObject, 1, 0, 2000); }

    printf("----\n");

    testingFunction(&myObject, 10, 0, 2000);

    return 0;
}

50毫秒对于QueryPerformanceCounter()来说太快了?然后可能是QueryPerformanceCounter()没有在您的平台上实现,或者您使用了错误的方法。您忘记了重新初始化。只发布有问题的代码,而不是有效的代码。看起来像方法myMethod()正在使用一些正在使用的资源。在初始版本中,您正在重新设置资源,但在扩展版本中,您继续使用越来越多的资源。实际答案在“myObject”中,因此我们需要类声明、所有方法定义和调用测试的代码位。您应该做的是提供一个编译器其他人可以测试的一段不可靠的代码。
#include <sys/time.h> 

long myclock()
{
    struct timeval tv;
    gettimeofday(&tv, NULL);
    return (tv.tv_sec * 1000000) + tv.tv_usec;
}
long start = myclock();

for (i=0;i<2000;i++)
{
    myObject->myMethod(x);
}

long diff = myclock() - start;
std::cout << "[" << time->tm_hour << ":"<< time->tm_min << ":" << time->tm_sec << 
             "] time:" << std::setprecision(3) << diff/1000000.0 << std::endl;
#include <stdio.h>
#include <time.h>

class MyObject
{
    public:
        void myMethod(int i) { for (long k=0; k<100000; k++) { } }
};

void testingFunction(MyObject *myObject,
                     int numberOfRepetitions,
                     int startAt, int endAt) 
{
    int i,j; 
    clock_t start,end; 
    for (j=0;j<numberOfRepetitions;j++) 
    { 
         start=clock();
         for (i=startAt;i<endAt;i++) 
         { 
             myObject->myMethod(i); 
         } 
         end = clock()-start; 
         printf("->Partial time: %d\n", end); 
    } 
 } 


int main(int argc, char * argv[])
{
    MyObject myObject;

    for (int i = 0; i < 10; i++)
    { testingFunction(&myObject, 1, 0, 2000); }

    printf("----\n");

    testingFunction(&myObject, 10, 0, 2000);

    return 0;
}
->Partial time: 406
->Partial time: 406
->Partial time: 406
->Partial time: 406
->Partial time: 391
->Partial time: 406
->Partial time: 407
->Partial time: 406
->Partial time: 406
->Partial time: 391
----
->Partial time: 406
->Partial time: 406
->Partial time: 406
->Partial time: 407
->Partial time: 406
->Partial time: 391
->Partial time: 406
->Partial time: 406
->Partial time: 406
->Partial time: 407