-->

CTimeSpan总是得到零(CTimeSpan always gets zero)

2019-10-21 00:59发布

我试图让插入的运行时间排序算法。 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

Answer 1:

ctime并非意味着时间的事情分辨率小于一秒钟。 我觉得你真的以后有什么是一样的东西GetTickCountGetTickCount64 。 看到这个MSDN 链接 。

GetTickCount函数

自从检索系统启动,高达49.7天即所经过的毫秒数。

如果使用GetTickCount64你可以声明startTimeendTime是这样的:

uint64_t endTime, startTime, diffTime;

然后使用GetTickCount64与东西毫秒来获取时间像

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

diffTime = endTime - startTime;

当然diffTime可以,但是你想使用。

如果您不需要时间事情超过一个月,那么你可以简单地使用GetTickCount和返回的类型将是一个uint32_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中找到入口



文章来源: CTimeSpan always gets zero