Как рассчитать время выполнения метода с помощью Chrono в C ++? - PullRequest
0 голосов
/ 07 марта 2020

Итак, я впервые пытался измерить производительность и следил за некоторыми онлайн-ресурсами, чтобы протестировать уменьшенную версию своего кода перед тем, как попробовать его в своей курсовой работе. К сожалению, я не могу заставить его напечатать время, необходимое для завершения функции, и я не уверен, что я даже делаю это правильно.

#include <string>
#include <iostream>
#include <unordered_map>
#include <chrono>

using namespace std;

class Timer {
public:
   Timer() {
       startTimept = std::chrono::high_resolution_clock::now();
   }

   ~Timer() {
       Timer Stop();
   }

   void Stop() {
       auto endTimept = std::chrono::high_resolution_clock::now();

       auto start = std::chrono::time_point_cast<std::chrono::microseconds>(startTimept).time_since_epoch().count();
       auto end = std::chrono::time_point_cast<std::chrono::microseconds>(endTimept).time_since_epoch().count();

       auto duration = end - start;
       double ms = duration * 0.001;

       std::cout << duration << "us (" << ms << "ms)";

   }
private:
   std::chrono::time_point<std::chrono::high_resolution_clock> startTimept;
};

int main()
{
   std::unordered_map<std::string, std::string>::iterator found, start, nFound;

//ADDS PAIRS OF SENTENCE INTO A MAP
   std::unordered_map<std::string, std::string> sortMap =
   { { "these", "pairs" }, { "the", "correct" }, { "pairs", "makes" }, { "correct", "sentence" }, { "makes", "the" } };
   std::unordered_map<std::string, std::string> swapMap =
   { { "pairs","these" }, {"correct", "the"}, { "makes", "pairs" }, {"sentence", "correct" }, {"the",  "makes"} };

//CREATES CONTAINER TO STORE COMPLETE SENTENCE
   std::list<std::string> resultSeq;

   start = sortMap.begin();

//ADD STARTING WORDS INTO THE LIST
   resultSeq.push_back(start->first);
   resultSeq.push_back(start->second);

//TEMP POINTER TO SOUGHT WORD
   found = sortMap.find(start->second);

//THIS IS THE FUNCTION I AM TRYING TO TEST
   {
       Timer timer();
       for (auto it = sortMap.begin(); it != sortMap.end(); ++it) {
           if (it == found) {
               resultSeq.push_back(it->second);
               found = sortMap.find(it->second);
               it = sortMap.begin();
           }
       }
   }

   for (std::list<std::string>::iterator hard = resultSeq.begin(); hard != resultSeq.end(); ++hard)
   {
       std::cout << (*hard) << std::endl;
   }

   __debugbreak;
}

Если кто-то может определить, что я делаю неправильно или предложите любые ссылки, которые помогут с измерением производительности, которые будут очень полезны!

1 Ответ

0 голосов
/ 07 марта 2020

Мой личный подход, если это просто для быстрой отладки, будет использовать std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();. Так как это довольно многословно, я бы рекомендовал сделать для него функцию-обертку. В любом случае, это просто возвращает время в миллисекундах с 1970 года (не уверен насчет этого). Затем вы просто вставляете одну перед функцией, а другую после нее, cout разницу, и у вас есть миллисекунды, которые функция потратила на выполнение.

...