```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;
}
```