Advertisement
kutuzzzov

Урок 6 Измеряем и ускоряем

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