簡體   English   中英

CTimeSpan總是為零

[英]CTimeSpan always gets zero

我正在嘗試獲取插入排序算法的運行時間。 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的目的不是將事物計時的分辨率小於一秒。 我認為您真正追求的是諸如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 條目中找到有關高性能計時器的信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM