CTimeSpan总是为零

Fang

我正在尝试获取插入排序算法的运行时间。MSDN表示使用CTime可以获得经过时间。但是我尝试了很多次,总是得到零。我认为运行该算法的时间不可能为零。必须有一些错误或其他错误。有人可以帮我吗?我在下面发布了我的代码:

#include <cstdlib>
#include <iostream>
#include <atltime.h> 
using namespace std;
//member function
void insertion_sort(int arr[], int length);
int *create_array(int arrSize);

int main() {
    //Create random array
    int arraySize=100;
    int *randomArray=new int[arraySize];
    int s;
    for (s=0;s<arraySize;s++){
        randomArray[s]=(rand()%99)+1;
    }

    CTime startTime = CTime::GetCurrentTime();

    int iter;
    for (iter=0;iter<1000;iter++){
        insertion_sort(randomArray,arraySize);
    }

    CTime endTime = CTime::GetCurrentTime();
    CTimeSpan elapsedTime = endTime - startTime;
    double nTMSeconds = elapsedTime.GetTotalSeconds()*1000;
    cout<<nTMSeconds;
    return 0;
}//end of main
迈克尔·佩奇

CTime的目的不是将事物计时的分辨率小于一秒。我认为您真正追求的是类似GetTickCount或的东西GetTickCount64请参阅此MSDN链接

GetTickCount函数

检索自系统启动以来经过的毫秒数,最长为49.7天。

如果使用GetTickCount64您可以声明startTimeendTime这种方式:

uint64_t endTime, startTime, diffTime;

然后使用GetTickCount64来检索时间(以毫秒为单位),例如

startTime = GetTickCount64();
... do stuff ...
endTime = GetTickCount64();

diffTime = endTime - startTime;

当然,您也可以使用diffTime。

如果您不需要为一个月以上的时间计时,则只需使用GetTickCount,返回的类型将是auint32_t而不是uint64_t

如果您需要超过1毫秒的分辨率来进行计时,并且您的计算机支持高分辨率计时器,那么此代码可能会起作用:

LARGE_INTEGER freq;
double time_sec = 0.0;

if (QueryPerformanceFrequency(&freq))
{
    LARGE_INTEGER start;
    LARGE_INTEGER stop;

    QueryPerformanceCounter(&start);

    // Do Stuff to time Here

    QueryPerformanceCounter(&stop);
    time_sec = (uint64_t)(stop.QuadPart - start.QuadPart) / (double)freq.QuadPart;
}
else {
    cout << "Your computer doesn't have a high resolution timer to use";
} 

可以在此MSDN条目中找到有关高性能计时器的信息。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章