Как время функции в миллисекундах без повышения:: таймер
Я использую boost 1.46, который не включает boost:: timer, какой еще способ я могу засечь мои функции.
В настоящее время я делаю это:
time_t now = time(0);
<some stuff>
time_t after = time(0);
cout << after - now << endl;
Но он просто дает ответ в секундах, поэтому, если функция принимает
Спасибо
5 ответов:
В 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; }
Удачи;)
Используя
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)
).
Оказывается, есть версия time в boost 1.46 (только в другом месте). Благодаря @jogojapan за то, что указал на это.
Это можно сделать так:
#include <boost/timer.hpp> timer t; <some stuff> std::cout << t.elapsed() << std::endl;
Или альтернативно используя std libs, как указал @Quentin Perez (и я приму то, что было первоначально предложено)
Основываясь на решении Квентина Переса, вы можете передать произвольную функцию времени с помощью функции std:: и лямбды.
#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; }
Можно использовать 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. } }