Advertisement
chevengur

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

Mar 13th, 2024
1,000
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.52 KB | None | 0 0
  1. #include <cstdlib>
  2. #include <iostream>
  3. #include <vector>
  4. #include <chrono>
  5.  
  6. using namespace std;
  7.  
  8. vector<int> ReverseVector(const vector<int>& source_vector) {
  9.     vector<int> res;
  10.     for (int i : source_vector) {
  11.         res.insert(res.begin(), i);
  12.     }
  13.  
  14.     return res;
  15. }
  16.  
  17. int CountPops(const vector<int>& source_vector, int begin, int end) {
  18.     int res = 0;
  19.  
  20.     for (int i = begin; i < end; ++i) {
  21.         if (source_vector[i]) {
  22.             ++res;
  23.         }
  24.     }
  25.  
  26.     return res;
  27. }
  28.  
  29. void AppendRandom(vector<int>& v, int n) {
  30.     for (int i = 0; i < n; ++i) {
  31.         // получаем случайное число с помощью функции rand.
  32.         // с помощью (rand() % 2) получим целое число в диапазоне 0..1.
  33.         // в C++ имеются более современные генераторы случайных чисел,
  34.         // но в данном уроке не будем их касаться
  35.         v.push_back(rand() % 2);
  36.     }
  37. }
  38.  
  39. void Operate() {
  40.     vector<int> random_bits;
  41.  
  42.     // операция << для целых чисел это сдвиг всех бит в двоичной
  43.     // записи числа. Запишем с её помощью число 2 в степени 17 (131072)
  44.     static const int N = 1 << 17;
  45.  
  46.     // заполним вектор случайными числами 0 и 1
  47.     const chrono::steady_clock::time_point start_time_append = chrono::steady_clock::now();
  48.     AppendRandom(random_bits, N);
  49.     const chrono::steady_clock::time_point end_time_append = chrono::steady_clock::now();
  50.     const chrono::steady_clock::duration duration_append_random = end_time_append - start_time_append;
  51.  
  52.    
  53.     // перевернём вектор задом наперёд
  54.     const chrono::steady_clock::time_point start_time_reverse = chrono::steady_clock::now();
  55.     vector<int> reversed_bits = ReverseVector(random_bits);
  56.     const chrono::steady_clock::time_point end_time_reverse = chrono::steady_clock::now();
  57.     const chrono::steady_clock::duration duration_reverse_vector = end_time_reverse - start_time_reverse;
  58.  
  59.     // посчитаем процент единиц на начальных отрезках вектора
  60.     const chrono::steady_clock::time_point start_time_counting = chrono::steady_clock::now();
  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.     const chrono::steady_clock::time_point end_time_counting = chrono::steady_clock::now();
  70.  
  71.     const chrono::steady_clock::duration duration_counting = end_time_counting - start_time_counting;
  72.  
  73.     cerr << "Append random: " << std::chrono::duration_cast<std::chrono::milliseconds>(duration_append_random).count() << " ms" << endl;
  74.     cerr << "Reverse: " << std::chrono::duration_cast<std::chrono::milliseconds>(duration_reverse_vector).count() << " ms" << endl;
  75.     cerr << "Counting: " << std::chrono::duration_cast<std::chrono::milliseconds>(duration_counting).count() << " ms" << endl;
  76. }
  77.  
  78. int main() {
  79.     Operate();
  80.     return 0;
  81. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement