```cpp #include <iostream> #include <vector> #include <random> #include <chrono> int main() { // время работы бенчмарка по умолчанию long long milliseconds = 6000; // размер буфера чисел для бенчмарке в тесте (нужен, чтобы избежать работы L1/L2/L3-кэша процессора) int randomBufferSize = 20000; // заполнение буфера 32-битных чисел с плавающей запятой(float) для участия в бенчмарке std::vector<float> mem1; std::mt19937 rnd1(777); for (int n = 0; n < randomBufferSize; n++) { float a = static_cast<float>(rnd1() % INT_MAX) * 1000.0f; float b = static_cast<float>(rnd1() % INT_MAX) + a; float c = static_cast<float>(rnd1() % INT_MAX) / 10000.0f + b; mem1.push_back(c == 0.0f ? 1.0f : c); } // заполнение буфера 64-битных чисел с плавающей запятой(double) для участия в бенчмарке std::vector<double> mem2; std::mt19937 rnd2(777); for (int n = 0; n < randomBufferSize; n++) { double a = static_cast<double>(rnd2() % INT_MAX) * 1000.0; double b = static_cast<double>(rnd2() % INT_MAX) + a; double c = static_cast<double>(rnd2() % INT_MAX) / 10000.0 + b; mem2.push_back(c == 0.0 ? 1.0 : c); } // числа, участвующие в бенчмарке вынесены из цикла, чтобы избежать затрат ресурсов на выделение памяти на каждой итерации long long v4 = 0; float v11, r1 = 0.0f; double v10, r2 = 0.0; int v5 = 300; int v6 = 0; int v7, v8, v9; // таймер для подсчета прошедшего времени auto start_time = std::chrono::high_resolution_clock::now(); // основной цикл бенчмарка длительностью в 6 секунд while (true) { v7 = v6; v8 = v6 + 1; v9 = v8; v6 = v8 + 1; v10 = mem2[v9]; v11 = mem1[v9]; // 32-битный эксперимент: сложение/вычитание/умножение/деление (20 операций) r1 = (((((((((((((((((((v11 + mem1[v7]) - v11) * v11) + v11) - v11) * v11) + v11) - v11) * v11) / v11) + v11) - v11) * v11) + v11) - v11) * v11) + v11) - v11) * v11) / v11; // 64-битный эксперимент: сложение/вычитание/умножение/деление (20 операций) r2 = ((((((v10 + mem2[v7] - v10) * v10 + v10 - v10) * v10 + v10 - v10) * v10 / v10 + v10 - v10) * v10 + v10 - v10) * v10 + v10 - v10) * v10 / v10; // суммирование всех операций за итерацию (20+20) v4 += 40; // добавлено(!): бессмысленная проверка r1 и r2, чтобы компилятор не срезал полезные вычисления в ходе оптимизации -O3 if(r1 == 0 && r2 == 0){ break; } if (--v5 == 0) { // если время бенчмарка подошло к концу, выйти из цикла auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::high_resolution_clock::now() - start_time).count(); if (elapsed >= milliseconds) { break; } v5 = 300; } if (v6 >= 20000) { v6 = 0; } } auto end_time = std::chrono::high_resolution_clock::now(); auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(end_time - start_time).count(); // итоговый результат = число операций в микросекунду double result = (static_cast<double>(v4) / elapsed) / 1000.0; // выводим числа r1 и r2 чтобы компилятор не срезал полезные вычисления в ходе оптимизации std::cout << "FloatingPointMath Test: " << result << " | " << r1 << ", " << r2 << std::endl; getchar(); return 0; } ```