Advertisement
chevengur

СПРИНТ № 6 | Профилируем и ускоряем | Урок 6: Измеряем и ускоряем

Mar 20th, 2024
605
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.95 KB | None | 0 0
  1. log_duration.h
  2.  
  3. #pragma once
  4.  
  5. #include <chrono>
  6. #include <iostream>
  7.  
  8. #define PROFILE_CONCAT_INTERNAL(X, Y) X##Y
  9. #define PROFILE_CONCAT(X, Y) PROFILE_CONCAT_INTERNAL(X, Y)
  10. #define UNIQUE_VAR_NAME_PROFILE PROFILE_CONCAT(profileGuard, __LINE__)
  11. #define LOG_DURATION(x) LogDuration UNIQUE_VAR_NAME_PROFILE(x)
  12.  
  13. class LogDuration {
  14. public:
  15.     // заменим имя типа std::chrono::steady_clock
  16.     // с помощью using для удобства
  17.     using Clock = std::chrono::steady_clock;
  18.  
  19.     LogDuration(const std::string& id) : id_(id) {
  20.     }
  21.  
  22.     ~LogDuration() {
  23.         using namespace std::chrono;
  24.         using namespace std::literals;
  25.  
  26.         const auto end_time = Clock::now();
  27.         const auto dur = end_time - start_time_;
  28.         std::cerr << id_ << ": "s << duration_cast<milliseconds>(dur).count() << " ms"s << std::endl;
  29.     }
  30.  
  31. private:
  32.     const std::string id_;
  33.     const Clock::time_point start_time_ = Clock::now();
  34. };
  35. ***************************************************************************************************************************************
  36.  
  37. main.cpp
  38.  
  39. #include "log_duration.h"
  40.  
  41. #include <algorithm>
  42. #include <chrono>
  43. #include <cstdlib>
  44. #include <iostream>
  45. #include <vector>
  46.  
  47. using namespace std;
  48.  
  49. vector<int> ReverseVector(const vector<int>& source_vector) {
  50.     vector<int> res;
  51.  
  52.     for (int i : source_vector) {
  53.         res.insert(res.begin(), i);
  54.     }
  55.  
  56.     return res;
  57. }
  58.  
  59. vector<int> ReverseVector2(const vector<int>& source_vector) {
  60.     vector<int> res;
  61.  
  62.     // будем проходить source_vector задом наперёд
  63.     // с помощью обратного итератора
  64.     for (auto iterator = source_vector.rbegin(); iterator != source_vector.rend(); ++iterator) {
  65.         res.push_back(*iterator);
  66.     }
  67.  
  68.     return res;
  69. }
  70.  
  71. vector<int> ReverseVector3(const vector<int>& source_vector) {
  72.     return { source_vector.rbegin(), source_vector.rend() };
  73. }
  74.  
  75. vector<int> ReverseVector4(const std::vector<int>& source_vector) {
  76.     std::vector<int> res(source_vector.size());
  77.     std::reverse_copy(source_vector.begin(), source_vector.end(), res.begin());
  78.     return res;
  79. }
  80.  
  81. void Operate() {
  82.     vector<int> rand_vector;
  83.     int n;
  84.  
  85.     cin >> n;
  86.     rand_vector.reserve(n);
  87.  
  88.     for (int i = 0; i < n; ++i) {
  89.         rand_vector.push_back(rand());
  90.     }
  91.  
  92.     if(n<=100000)
  93.     {
  94.         {
  95.             LOG_DURATION("Naive");
  96.             ReverseVector(rand_vector);
  97.         }
  98.         {
  99.             LOG_DURATION("Good");
  100.             ReverseVector2(rand_vector);
  101.         }
  102.     }
  103.     else
  104.     {
  105.         {
  106.             LOG_DURATION("Good");
  107.             ReverseVector2(rand_vector);
  108.         }
  109.         {
  110.             LOG_DURATION("Best");
  111.             ReverseVector3(rand_vector);
  112.         }
  113.         {
  114.             LOG_DURATION("Your");
  115.             ReverseVector4(rand_vector);
  116.         }
  117.     }
  118. }
  119.  
  120. int main() {
  121.     Operate();
  122.     return 0;
  123. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement