Загадочное замедление при добавлении дублей в вектор Dynami c в C ++ - PullRequest
1 голос
/ 06 мая 2020

Я испытываю неизвестное замедление при добавлении двойников к очень большому динамическому c вектору двойников в C ++.

Как видно ниже, похоже, что замедление происходит именно из-за добавления двойника, который был вычислен из длинной суммы функций cos и sin.

Когда только A_temp1 добавляется к динамическому c вектор, замедления нет:

    for(int i=0;i<=imax;i++){
    // neither of these cause slowdown on their own
       A_temp1 = pi;
       A_temp2 = [long-winded sum of sin and cos operations]; 
    // no slowdown if only A_temp1 is  added
        A_dyn_vec[i] = A_temp1; 
    }

Однако при добавлении A_temp2 к вектору наблюдается значительное замедление:

    for(int i=0;i<=imax;i++){
    // neither of these cause slowdown on their own
       A_temp1 = pi;
       A_temp2 = [long-winded sum of sin and cos operations]; 
    // significant slowdown 
        A_dyn_vec[i] = A_temp1 + A_temp2; 
    }

Также, когда оба объединяются в при одном значении A_temp наблюдается такое же значительное замедление:

    for(int i=0;i<=imax;i++){
    // neither of these cause slowdown on their own
       A_temp = pi + [long-winded sum of sin and cos operations]; 
    // significant slowdown 
        A_dyn_vec[i] = A_temp;
    }

В общем, по какой-то причине добавление A_temp1 не вызывает замедления, а A_temp2 вызывает, хотя оба они дублируются.

A_temp2 определенно произошел от функции, содержащей длинную сумму функций cos и sin. Возможно, проблема возникает из-за того, как этот номер хранится, но я не могу точно понять, почему.

Я был бы очень признателен, если бы у кого-нибудь была информация о том, почему в этой ситуации происходит замедление и как этого избежать.

Спасибо!

1 Ответ

0 голосов
/ 06 мая 2020

Если вы вообще не используете A_temp2, я считаю, что это оптимизация компилятора и даже не вычисляет число, потому что вы его не используете. Когда вы начнете использовать его во втором коде. Он не может игнорировать вычисление, которое вызывает замедление.

Изменить: я думаю, что единственный способ уменьшить время выполнения в вашем случае - это улучшить сумму синусов и косинусов. По сути, просто уменьшите количество выполняемых вами вызовов функций. Например, напишите sin(i)^2 + cos(i)^2 как 1. Это уменьшит количество вызовов функций. Или сделайте следующее.

temp1 = sin(i);
temp2 = cos(i);
do the sum operation with temp1 and temp2 instead of calling the sin and cos functions again and again.
...