|
|
От: | Serg27 | |
| Дата: | 11.03.17 18:23 | ||
| Оценка: | 18 (2) | ||
#define _USE_MATH_DEFINES
#include <cmath>
#include <time.h>
#include <iostream>
using namespace std;
constexpr auto N_MULTIPLY = 1000000;// 10000000;
constexpr int N_GENERATED = 1000;
double outputs_dbl[N_GENERATED];
template<typename F> void Measure(F f)
{
int i;
for (i = 2; i<N_MULTIPLY; i++) {
for (int j = 0; j<N_GENERATED; j++) f(i, j);
}
// if (i == 0) cout << "msvc";
}
void fun1(int i, int j)
{
outputs_dbl[j%N_GENERATED] = sin((double)i);
}
void fun2(int i, int j)
{
outputs_dbl[j] = sin((double)i);
}
int main()
{
auto start = clock();
Measure(fun1);
auto finish = clock();
double duration = (double)(finish - start) / CLOCKS_PER_SEC;
cout << "Measure(fun1) - " << duration << " s." << endl;
start = clock();
Measure(fun2);
finish = clock();
duration = (double)(finish - start) / CLOCKS_PER_SEC;
cout << "Measure(fun2) - " << duration << " s." << endl;
}Если запретить оптимизацию в Release то получится следующее:Measure(fun1) — 1.422 s.
Measure(fun2) — 26.15 s.
Т.е. оптимизация для fun1 дала выигрыш в 27 раз, а для fun2 в 1,5. Глядя на код, оптимизация конечно должна была быть в N_MULTIPLY раз, так результат работы кода — заполненный массив outputs_dbl значением sin(N_MULTIPLY). Но по каким-то соображениям компилятор этого не сделал.Measure(fun1) — 38.862 s.
Measure(fun2) — 38.116 s.