Re: Очередной "шедевр" от MS
От: Serg27  
Дата: 11.03.17 18:23
Оценка: 18 (2)
Здравствуйте, alex_public, Вы писали:
_>Но на фоне открывшейся чудесной "особенности" компилятора от MS данные проценты производительности уже перестают иметь какое-либо значение. На мой взгляд компилятор способный по не объяснимым причинам замедлить исполнение куска кода более чем в 100 раз вообще не может быть пригоден к использованию.

Упрощенный пример кода:

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


Результат выполнения (intel I5-2520m), VS 2015 update 3. Различные опции оптимизации влияют слабо.

Measure(fun1) — 1.422 s.
Measure(fun2) — 26.15 s.

Если запретить оптимизацию в Release то получится следующее:

Measure(fun1) — 38.862 s.
Measure(fun2) — 38.116 s.

Т.е. оптимизация для fun1 дала выигрыш в 27 раз, а для fun2 в 1,5. Глядя на код, оптимизация конечно должна была быть в N_MULTIPLY раз, так результат работы кода — заполненный массив outputs_dbl значением sin(N_MULTIPLY). Но по каким-то соображениям компилятор этого не сделал.

Почему такие небольшие изменения в коде дают такие результаты интересно только разработчикам компилятора.

Конечно для оценки качества генерации компилятора использовать код такого типа нельзя, так как время выполнения может быть от 0 (просто сгенировать нужный массив на этапе компиляции/загрузки) до плохо оптимизированного. Не зря же используют какие-то более реальные задачи со сложным кодом для проверки оптимизации компилятором.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.