Advertisement
chevengur

СПРИНТ № 6 | Профилируем и ускоряем | Урок 9: Вглубь процессора

Mar 26th, 2024
938
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.28 KB | None | 0 0
  1. main.cpp
  2.  
  3. #include <iostream>
  4. #include <vector>
  5. #include <cassert>
  6.  
  7. using namespace std;
  8.  
  9. struct days {
  10.     int count;
  11.     float sum;
  12. };
  13.  
  14. std::vector<float> ComputeAvgTemp(const std::vector<std::vector<float>>& measures) {
  15.  
  16.     if (measures.empty() || measures[0].empty()) {
  17.         return {};
  18.     }
  19.     // Инициализация вектора структур days для хранения суммы и количества измерений для каждой минуты
  20.     std::vector<days> aggregated(measures.size()); // Используем размер первого внутреннего вектора
  21.  
  22.     for (const auto& day : measures) {
  23.         for (size_t i = 0; i < day.size(); ++i) { // Используем размер текущего внутреннего вектора
  24.             if (day[i] > 0) {
  25.                 aggregated[i].sum += day[i];
  26.                 aggregated[i].count++;
  27.             }
  28.         }
  29.     }
  30.  
  31.     // Инициализация вектора для хранения средних значений
  32.     std::vector<float> averages(measures[0].size());
  33.  
  34.     // Вычисление средних значений для каждой минуты
  35.     for (size_t i = 0; i < measures[0].size(); ++i) { // Используем размер первого внутреннего вектора
  36.         averages[i] = (aggregated[i].count > 0) ? aggregated[i].sum / aggregated[i].count : 0;
  37.     }
  38.  
  39.  
  40.     return averages;
  41. }
  42.  
  43. void Test() {
  44.     // 4 дня по 3 измерения
  45.     vector<vector<float>> v = {
  46.         {0, -1, -1},
  47.         {1, -2, -2},
  48.         {2, 3, -3},
  49.         {3, 4, -4}
  50.     };
  51.  
  52.     // среднее для 0-го измерения (1+2+3) / 3 = 2 (не учитывам 0)
  53.     // среднее для 1-го измерения (3+4) / 2 = 3.5 (не учитывам -1, -2)
  54.     // среднее для 2-го не определено (все температуры отрицательны), поэтому должен быть 0
  55.  
  56.     assert(ComputeAvgTemp(v) == vector<float>({ 2, 3.5f, 0 }));
  57. }
  58.  
  59. int main() {
  60.     Test();
  61.     cout << "Test passed successfully!" << endl;
  62.     return 0;
  63. }
  64.  
  65. ***************************************************************************************************************************************
  66. log_duration.h
  67.  
  68. #pragma once
  69.  
  70. #include <chrono>
  71. #include <iostream>
  72.  
  73. #define PROFILE_CONCAT_INTERNAL(X, Y) X##Y
  74. #define PROFILE_CONCAT(X, Y) PROFILE_CONCAT_INTERNAL(X, Y)
  75. #define UNIQUE_VAR_NAME_PROFILE PROFILE_CONCAT(profileGuard, __LINE__)
  76. #define LOG_DURATION(x) LogDuration UNIQUE_VAR_NAME_PROFILE(x)
  77.  
  78. class LogDuration {
  79. public:
  80.     // заменим имя типа std::chrono::steady_clock
  81.     // с помощью using для удобства
  82.     using Clock = std::chrono::steady_clock;
  83.  
  84.     LogDuration(const std::string& id) : id_(id) {
  85.     }
  86.  
  87.     ~LogDuration() {
  88.         using namespace std::chrono;
  89.         using namespace std::literals;
  90.  
  91.         const auto end_time = Clock::now();
  92.         const auto dur = end_time - start_time_;
  93.         std::cerr << id_ << ": "s << duration_cast<milliseconds>(dur).count() << " ms"s << std::endl;
  94.     }
  95.  
  96. private:
  97.     const std::string id_;
  98.     const Clock::time_point start_time_ = Clock::now();
  99. };
  100.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement