Advertisement
AlexDanilin

Урок 3: Измеряем время

Jul 25th, 2023
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.98 KB | None | 0 0
  1. //Урок 3: Измеряем время
  2. #include <cstdlib>
  3. #include <iostream>
  4. #include <vector>
  5. #include <chrono>
  6.  
  7. using namespace std;
  8. using namespace chrono;
  9.  
  10. vector<int> ReverseVector(const vector<int>& source_vector) {
  11.     vector<int> res;
  12.     for (int i : source_vector) {
  13.         res.insert(res.begin(), i);
  14.     }
  15.  
  16.     return res;
  17. }
  18.  
  19. int CountPops(const vector<int>& source_vector, int begin, int end) {
  20.     int res = 0;
  21.  
  22.     for (int i = begin; i < end; ++i) {
  23.         if (source_vector[i]) {
  24.             ++res;
  25.         }
  26.     }
  27.  
  28.     return res;
  29. }
  30.  
  31. void AppendRandom(vector<int>& v, int n) {
  32.     for (int i = 0; i < n; ++i) {
  33.         // получаем случайное число с помощью функции rand.
  34.         // с помощью (rand() % 2) получим целое число в диапазоне 0..1.
  35.         // в C++ имеются более современные генераторы случайных чисел,
  36.         // но в данном уроке не будем их касаться
  37.         v.push_back(rand() % 2);
  38.     }
  39. }
  40.  
  41. void Operate() {
  42.     vector<int> random_bits;
  43.  
  44.     // операция << для целых чисел это сдвиг всех бит в двоичной
  45.     // записи числа. Запишем с её помощью число 2 в степени 17 (131072)
  46.     static const int N = 1 << 17;
  47.  
  48.     // заполним вектор случайными числами 0 и 1
  49.     auto start_time = steady_clock::now();
  50.     AppendRandom(random_bits, N);
  51.     auto end_time = steady_clock::now();
  52.     auto dur = end_time - start_time;
  53.  
  54.     // перевернём вектор задом наперёд
  55.     auto start_time1 = steady_clock::now();
  56.     vector<int> reversed_bits = ReverseVector(random_bits);
  57.      auto end_time1 = steady_clock::now();
  58.     auto dur1 = end_time1 - start_time1;
  59.  
  60.     // посчитаем процент единиц на начальных отрезках вектора
  61.     auto start_time2 = steady_clock::now();
  62.     for (int i = 1, step = 1; i <= N; i += step, step *= 2) {
  63.         // чтобы вычислить проценты, мы умножаем на литерал 100. типа double;
  64.         // целочисленное значение функции CountPops при этом автоматически
  65.         // преобразуется к double, как и i
  66.         double rate = CountPops(reversed_bits, 0, i) * 100. / i;
  67.         cout << "After "s << i << " bits we found "s << rate << "% pops"s
  68.              << endl;
  69.     }
  70.      auto end_time2 = steady_clock::now();
  71.     auto dur2 = end_time2 - start_time2;
  72.     cerr << "Append random: "s << duration_cast<milliseconds>(dur).count() << " ms"s << endl
  73.          << "Reverse: "s << duration_cast<milliseconds>(dur1).count() << " ms"s << endl
  74.         << "Counting: "s << duration_cast<milliseconds>(dur2).count() << " ms"s << endl;
  75. }
  76.  
  77. int main() {
  78.     Operate();
  79.     return 0;
  80. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement