Advertisement
kutuzzzov

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

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