在 C++ 中向动态向量添加双打时神秘的减速

Mysterious slowdown when adding doubles to dynamic vector in C++

在 C++ 中将双精度添加到非常大的双精度动态向量时,我遇到了一些未知的减速。

如下所示,减速似乎是由于添加了一个由冗长的 cos 和 sin 函数求和计算得出的双精度值。

动态向量只加A_temp1时,没有减速:

    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 函数的冗长求和的函数。也许这个数字的存储方式导致了这个问题,但我无法弄清楚原因。

如果有人对为什么在这种情况下发生减速以及如何避免它有任何意见,我将不胜感激。

谢谢!

如果您根本没有使用 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.