我怎样才能加快这个循环?

时间:2015-11-25 10:53:10

标签: c performance loops

如何加速此循环(在C中)?

unsigned int x = 50000000;
double a= 0.9;
double b= -0.9;
for ( unsigned int i = 1; i <= x; i++)
{
    a *= 0.9; //power
    b -=  a/i;
}

执行时间:14.000秒

我不知道为什么,但是当我在代码中添加这两行时,执行时间只有1.000秒。

unsigned int x = 50000000;
double a= 0.9;
double b= -0.9;
for ( unsigned int i = 1; i <= x; i++)
{
    a *= 0.9; //power
    a += 10e250;
    a -=10e250;
    b -=  a/i;
}

感谢您的帮助

2 个答案:

答案 0 :(得分:6)

首先,代码运行速度低于预期的最可能原因是a变为非规范化数字。非规范化数字是一个特殊情况,可能会运行很多,速度慢很多。也可以通过添加10 ^ 251并再次减去它来将a更改为0并将零除以任何更快(因为结果不需要计算)。

但真正的加速来自不是愚蠢地添加微小的,没有任何影响的数字。当x =几百时,a将是如此之小以至于从b中减去a / i将不会产生任何差异。所以代替b - = a / i;你写的

<ribbon:RibbonMenuButton ToolTip="Interaction" LargeImageSource="Images/measures.png" Style="{x:Null}">
   <ribbon:RibbonMenuItem Header="Manip 3D" IsCheckable="True" IsChecked="{Binding ...}" />
   <ribbon:RibbonMenuItem Header="Points" IsCheckable="True" IsChecked="{Binding ...}" />
   <ribbon:RibbonMenuItem Header="Distances" IsCheckable="True" IsChecked="{Binding ...}" />
</ribbon:RibbonMenuButton>

你的时间会从秒变为不到一毫秒。

答案 1 :(得分:0)

添加10e250它超出了双变量可以支持的数字限制,当减去它时总是变为0.不确定这个但是乘法应该比加法花费更多的时间,所以它减慢了速度,例如。如果你试试这个:

for ( unsigned int i = 1; i <= x; i++)
{
  a ++; //power
  b -=  a/i;
}

你会看到它会像第二次一样运行。我想当你添加10e250并且在a = 0之后;乘以0比使用其他非零变量快。