【问题标题】:CTimeSpan always gets zeroCTimeSpan 总是为零
【发布时间】:2014-11-15 06:27:58
【问题描述】:

我正在尝试获取插入排序算法的运行时间。 MSDN说使用CTime可以得到Elapsed Time。但我试了很多次,总是零。我认为运行这个算法的时间不可能为零。一定有一些错误或其他东西。有人可以帮助我吗?我在下面发布了我的代码:

#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 的分辨率为一秒。显然,您的整个测试只需要不到一秒钟的时间。

标签: c++ ctime elapsedtime


【解决方案1】:

CTime 并不意味着将事物计时到小于一秒的分辨率。我认为您真正追求的是 GetTickCountGetTickCount64 。请参阅此 MSDN link

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 entry 中找到

【讨论】:

  • 我试过了,还是不行。我检查了开始时间和结束时间的值。他们是一样的。因此,diffTime 仍然为零。
  • 并不是说它不工作。无论您正在计时,都小于正在使用的计时器的分辨率。如果 get tickcount 产生 0,则意味着无论您计时的时间都小于 1 毫秒(1/1000 秒)。我提供了最后一种机制(我将其添加到我的答案中),但它在没有高分辨率计时器的某些计算机系统上不起作用。如果你有计时器,这将是你能得到的最好的。
猜你喜欢
  • 2017-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-08
  • 1970-01-01
  • 2016-02-14
  • 1970-01-01
相关资源
最近更新 更多