CTimeSpan всегда получает ноль

Я пытаюсь получить время работы алгоритма сортировки вставками. 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

person Fang    schedule 21.09.2014    source источник
comment
CTime имеет разрешение в одну секунду. Судя по всему, весь ваш тест занимает меньше секунды.   -  person Igor Tandetnik    schedule 21.09.2014


Ответы (1)


CTime не предназначен для определения времени до разрешения менее одной секунды. Я думаю, что вам действительно нужно что-то вроде GetTickCount или GetTickCount64 . См. эту ссылку MSDN .

Функция GetTickCount

Получает количество миллисекунд, прошедших с момента запуска системы, до 49,7 дней.

Если вы используете GetTickCount64, вы можете объявить startTime и endTime следующим образом:

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 запись

person Michael Petch    schedule 21.09.2014
comment
Я пробовал, но все еще не работает. Я проверил значение времени начала и время окончания. Они были такими же. Следовательно, diffTime по-прежнему равен нулю. - person Fang; 22.09.2014
comment
Дело не в том, что он не работает. Что бы вы ни выбрали, оно меньше, чем разрешение используемого таймера. Если get tickcount выдает 0, это означает, что все, что вы измеряете, составляет менее 1 миллисекунды (1/1000 секунды). Я предоставил последний механизм (я добавил его в свой ответ), но он не будет работать на некоторых компьютерных системах без таймера с высоким разрешением. Если у вас есть таймер, это будет лучшее, что вы можете получить. - person Michael Petch; 22.09.2014