Как рассчитать время функции в миллисекундах без boost :: timer

Я использую Boost 1.46, который не включает boost :: timer, Каким другим способом я могу рассчитать время моих функций.

В настоящее время я делаю это:

time_t now = time(0);
<some stuff>
time_t after = time(0);

cout << after - now << endl;

но он просто дает ответ в секундах, поэтому, если функция принимает < 1 показывает 0.

Спасибо

26

Решение

В Linux или Windows:

#include <ctime>
#include <iostream>

int
main(int, const char**)
{
std::clock_t    start;

start = std::clock();
// your test
std::cout << "Time: " << (std::clock() - start) / (double)(CLOCKS_PER_SEC / 1000) << " ms" << std::endl;
return 0;
}

Удачи 😉

29

Другие решения

С помощью std::chrono:

#include <chrono>
#include <thread>
#include <iostream>

// There are other clocks, but this is usually the one you want.
// It corresponds to CLOCK_MONOTONIC at the syscall level.
using Clock = std::chrono::steady_clock;
using std::chrono::time_point;
using std::chrono::duration_cast;
using std::chrono::milliseconds;
using namespace std::literals::chrono_literals;
using std::this_thread::sleep_for;

int main()
{
time_point<Clock> start = Clock::now();
sleep_for(500ms);
time_point<Clock> end = Clock::now();
milliseconds diff = duration_cast<milliseconds>(end - start);
std::cout << diff.count() << "ms" << std::endl;
}

std::chrono это C ++ 11, std::literals это C ++ 14 (в противном случае вам нужно milliseconds(500)).

19

Оказывается, есть версия времени в boost 1.46 (просто в другом месте). Благодаря
@jogojapan за указание на это.

Это можно сделать так:

#include <boost/timer.hpp>

timer t;
<some stuff>
std::cout << t.elapsed() << std::endl;

Или, в качестве альтернативы, используйте std libs, как указывал @Quentin Perez (и я приму, как и было изначально)

9

Основываясь на решении Квентина Переса, вы можете передать произвольную функцию времени, используя std :: function и lambda.

#include <ctime>
#include <iostream>
#include <functional>

void timeit(std::function<void()> func) {
std::clock_t start = std::clock();

func();

int ms = (std::clock() - start) / (double) (CLOCKS_PER_SEC / 1000);

std::cout << "Finished in " << ms << "ms" << std::endl;
}

int main() {
timeit([] {
for (int i = 0; i < 10; ++i) {
std::cout << "i = " << i << std::endl;
}
});

return 0;
}
3

Вы можете использовать long для хранения текущего значения времени в качестве начального значения, а затем преобразовать текущее время в двойное число. Вот некоторый фрагмент кода для использования в качестве примера.

#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <sys/types.h>
#include <sys/timeb.h>
int main()
{

struct      _timeb tStruct;
double      thisTime;
bool        done = false;
long        startTime;

struct _timeb
{
int   dstflag;   // holds a non-zero value if daylight saving time is in effect
long  millitm;   // time in milliseconds since the last one-second hack
long  time;      // time in seconds since 00:00:00 1/1/1970
long  timezone;  // difference in minutes moving west from UTC

};

_ftime(&tStruct); // Get start time

thisTime = tStruct.time + (((double)(tStruct.millitm)) / 1000.0); // Convert to double
startTime = thisTime;                                             // Set the starting time (when the function begins)while(!done)     // Start an eternal loop
{
system("cls");  // Clear the screen
_ftime(&tStruct);    // Get the current time
thisTime = tStruct.time + (((double)(tStruct.millitm)) / 1000.0); // Convert to double
// Check for 5 second interval to print status to screen
cout << thisTime-startTime; // Print it.

}
}
2
По вопросам рекламы [email protected]